如何在不加载它们的情况下列出Python软件包的依赖关系?
如何在不加载它们的情况下列出Python软件包的依赖关系?
有一种方法可以列出A → B C D,而不加载它们吗?
元数据中的“Requires”(使用“yolk -M A”)经常不完整,很烦人。
可以下载A.tar / A.egg,然后查看A/setup.py,但其中一些相当庞大。
(我本以为至少可以机械化获取一级依赖关系;即使是98%的解决方案也比大量下载要好。)
相关问题:
问题:如何在不加载它们的情况下列出Python软件包的依赖项?
在Python中,有时候我们需要知道一个脚本所引入的所有模块,以及这些模块所依赖的其他模块。Python标准库中的modulefinder模块提供了一个ModuleFinder类,可以用于确定脚本引入的模块集合。同时,modulefinder.py也可以作为一个脚本运行,需要传入一个Python脚本的文件名作为参数,然后会打印出被引入的模块的报告。
然而,对于modulefinder模块是否满足“不加载模块”的要求,还有些不确定。在这里的一个链接中提到,modulefinder使用字节码检查来查找依赖项,因此不会导致导入的模块产生任何副作用。
除了modulefinder模块外,还有一些其他的工具可以用于查找Python包的依赖关系,如pylint和Gui2exe。然而,使用modulefinder模块可能会显示出很多无用的信息和间接依赖(可能被依赖项使用,但实际上并没有使用)。可以在这里找到一个使用modulefinder模块的示例脚本,以及一个使用AST解析方法的替代脚本(对我来说效果更好)。
总结起来,要在不加载模块的情况下列出Python软件包的依赖项,可以使用modulefinder模块的ModuleFinder类来检查脚本引入的模块。另外,还可以考虑使用AST解析方法或其他工具来获取更精确和准确的依赖关系信息。
问题:如何列出Python包的依赖项而不加载它们?
在Python中,我们可以使用pip这个包来获取已安装包的依赖项。具体的做法是通过调用pip.get_installed_distributions()方法来获取已安装的包,并遍历这些包,获取每个包的依赖项。下面是一个示例代码:
def get_all_package_dependencies(): """Return dictionary of installed packages to list of package dependencies.""" return { dist.key: [r.key for r in dist.requires()] for dist in pip.get_installed_distributions() }
如果我们想要查看某个包的依赖项,可以使用命令
pip install --no-deps
来安装该包但不安装其依赖项,然后通过查看安装过程中的输出来获取依赖项的信息。
而且,我们还可以使用pprint模块来美化上述代码产生的输出结果。
需要注意的是,方法get_installed_distributions()已经被废弃,我们可以参考这里来获取替代方法。
Snakefood是一个Python软件包,用于查找Python包的依赖关系。它可以通过以下命令来列出Python包的依赖关系:
sfood -fuq package.py | sfood-target-files
其中,
-f
参数告诉sfood递归跟踪依赖关系,
-u
参数告诉sfood忽略未使用的导入,
-q
参数告诉sfood在调试信息方面保持安静。
为了从标准库中过滤掉模块,可以使用以下命令:
sfood -fuq package.py | sfood-filter-stdlib | sfood-target-files
如果还有其他要忽略的目录,可以使用sfood -I
标志。
然而,有用户报告说sfood-filter-stdlib
命令并不能完全从Python标准库中过滤掉模块。这是因为sfood-filter-stdlib
命令中硬编码了/usr/lib/python
路径,而且对于sfood-imports
命令也不起作用。
对此,有人建议使用sfood-filter-stdlib
命令从Python标准库中删除条目。同时,还提供了一个有关2008年打包方法的优秀链接。
另外,还有人报告说在Ubuntu 13.04上无法找到sfood-target-files
命令。但是在Ubuntu 12.04和14.04上都可以找到。建议尝试按照官方文档中的安装指南安装或升级到支持的Ubuntu版本。
总结起来,Snakefood是一个用于查找Python软件包依赖关系的工具,通过一系列命令可以列出依赖关系,并可以通过sfood-filter-stdlib
命令过滤掉Python标准库中的模块。然而,在某些情况下,这些命令可能会出现问题,例如sfood-filter-stdlib
命令中硬编码的路径以及sfood-target-files
命令在某些Ubuntu版本中无法找到。