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

Posted

技术标签:

【中文标题】列出python包依赖项而不加载它们?【英文标题】:list python package dependencies without loading them? 【发布时间】:2011-02-21 22:41:31 【问题描述】:

说python包A需要B、C和D; 有没有办法在不加载 A → B C D 的情况下列出它们?元数据中的Requires (yolk -M A) 通常不完整,grr。 可以下载A.tar/A.egg,然后查看A/setup.py, 但其中一些非常血腥。

(我认为至少获得第一级依赖项可以机械化; 即使是 98% 的解决方案也比雪崩式下载要好。)

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

【问题讨论】:

【参考方案1】:

如果你所说的包是指一个 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()
    

【讨论】:

我在网上看到一个包,想知道它的部门。有pip install --no-deps,然后四处挖掘......或者是否有更新的 pip 命令到 list-deps ? (需求文件通常不存在。) 和 pprint 可以用来漂亮地打印上面 sn-p 产生的输出 get_installed_distributions 现在是deprecated。【参考方案2】:

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。 sfoodxx -I /Library/...python2.6 (mac) 不会过滤掉标准导入 sys、os.path 等? @Denis:使用sfood-filter-stdlib 从 Python 标准库中删除条目。我将编辑我的答案以包含此... sfood-filter-stdlib 硬连线了“/usr/lib/python”,不适用于 sfood-imports。我问作者...顺便说一句,Kevin Teague,“我想要一匹小马”groups.google.com/group/django-developers/msg/5407cdb400157259 是 2008 年包装方法的杰出概述。) @Denis:谢谢;这是一个很好的链接。 sfood-target-files 在 Ubuntu 13.04 上不可用【参考方案3】:

modulefinder 来自标准库

2.3 版中的新功能。

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

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

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

其他关于pylint或Gui2exe的使用提示here

【讨论】:

modulefinder 确实有效,但它会显示很多无用的东西和间接依赖项(依赖项可能会被您的依赖项使用,但实际上不是)。您可以在此处找到我使用 modulefinder 执行的示例脚本:gist.github.com/lrq3000/6175634 在此处使用 AST 解析方法的替代脚本(这对我来说效果更好):gist.github.com/lrq3000/6175522

以上是关于列出python包依赖项而不加载它们?的主要内容,如果未能解决你的问题,请参考以下文章

未找到锁定文件。更新依赖项而不是从锁定文件安装。奥罗商业

Leiningen 中的本地依赖项而不创建 Maven 存储库?

从两个排序数组中获取前 K 项而不合并它们

指定 `bin_PROGRAMS` 的依赖项而不告诉 Automake 如何构建 `bin_PROGRAMS`

在 Windows 上部署 Python 包,编译依赖项,而不安装 Visual Studio?

python环境配置:pkg_info 命令列出依赖包(离线配置)