列出python包依赖项而不加载它们?

时间:2010-05-20 15:27:45

标签: python dependencies packaging

假设python包A需要B,C和D; 有没有一种方法可以列出A→B C D而不加载它们? 元数据中的Requiresyolk -M A)通常不完整,格林 可以下载A.tar / A.egg,然后查看A / setup.py, 但其中一些非常血腥。

(我认为至少可以获得第一级依赖关系; 即使是98%的解决方案也会比雪崩下载更好。)

相关问题: pip-upgrade-package-without-upgrading-dependencies

3 个答案:

答案 0 :(得分:28)

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标记。

答案 1 :(得分:13)

来自标准库

modulefinder

  

2.3版中的新功能。

     

此模块提供ModuleFinder   可用于确定的类   由a导入的模块集   脚本。 modulefinder.py也可以   作为脚本运行,给出文件名   一个Python脚本作为其参数,   之后进口的报告   模块将被打印。

我不确定它是否符合您关于不加载模块的要求。 From here

  

modulefinder使用字节码检查   找到依赖关系,因此是   没有任何可能的副作用   导入模块导致的   研究

关于使用pylint或Gui2exe here

的其他提示

答案 2 :(得分:6)

如果by package是指一个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()
    }