列出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 存储库?
指定 `bin_PROGRAMS` 的依赖项而不告诉 Automake 如何构建 `bin_PROGRAMS`