【问题标题】:list python package dependencies without loading them?列出python包依赖项而不加载它们?
【发布时间】: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

【问题讨论】:

    标签: python dependencies packaging


    【解决方案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
    猜你喜欢
    • 2021-01-01
    • 2013-01-16
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2016-09-30
    • 2021-04-20
    • 2020-05-25
    相关资源
    最近更新 更多