如何在不加载的情况下列出Python包依赖?

23 投票
3 回答
24992 浏览
提问于 2025-04-15 22:56

假设有一个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

Snakefood

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 这个选项。

撰写回答