如何在不加载的情况下列出Python包依赖?
假设有一个Python包A,它需要依赖包B、C和D;有没有办法在不加载这些包的情况下列出A → B C D呢?
在元数据中的Requires
(可以用yolk -M A
查看)通常是不完整的,真让人头疼。
你可以下载A.tar或A.egg,然后查看A/setup.py文件,但有些内容看起来相当复杂。
(我本以为至少能自动获取第一层依赖关系;即使是98%的解决方案也比一堆下载要好。)
还有一个相关的问题:pip升级包但不升级依赖
3 个回答
6
如果你说的包是指通过 pip 安装的包(而不是带有 __init__.py 的目录),那么你可以使用一个叫做 pip 的 Python 包。比如说:
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()
}
13
这是来自标准库的modulefinder模块。
这个模块在2.3版本中新增。
它提供了一个叫做ModuleFinder的类,可以用来找出一个脚本中导入了哪些模块。你也可以把modulefinder.py当作脚本来运行,只需要把一个Python脚本的文件名作为参数传入,之后就会打印出这个脚本导入的模块的报告。
我不太确定它是否符合你关于不加载模块的要求。这里有提到:
modulefinder通过检查字节码来查找依赖关系,因此在研究的模块被导入时不会产生任何副作用。
关于使用pylint或Gui2exe的其他提示可以在这里找到。
31
sfood -fuq package.py | sfood-target-files
这个工具会列出所有的依赖关系。
`-f` tells sfood to follow dependencies recursively
`-u` tells sfood to ignore unused imports
`-q` tells sfood to be quiet about debugging information
如果你想排除标准库中的模块,可以使用这个方法。
sfood -fuq package.py | sfood-filter-stdlib | sfood-target-files
正如你已经注意到的,如果还有其他目录你想要忽略,也可以使用 sfood -I
这个选项。