有没有办法显示pip包的依赖树?

183

我有一个项目,它有多个包依赖项,主要的要求在requirements.txt中列出。当我调用pip freeze时,它会以纯列表形式打印当前安装的包。我希望也能获得它们之间的依赖关系,类似于这样:

Flask==0.9
    Jinja2==2.7
    Werkzeug==0.8.3

Jinja2==2.7

Werkzeug==0.8.3

Flask-Admin==1.0.6
    Flask==0.9
    Jinja2==2.7
    Werkzeug==0.8.3

目标是检测每个特定软件包的依赖关系:

Werkzeug==0.8.3
    Flask==0.9
    Flask-Admin==1.0.6

并将它们插入到我当前的 requirements.txt 中。例如,对于此输入:

Flask==0.9
Flask-Admin==1.0.6
Werkzeug==0.8.3

我希望得到:

Flask==0.9
    Jinja2==2.7
Flask-Admin==1.0.6
Werkzeug==0.8.3

有什么方法可以显示已安装的pip软件包之间的依赖关系吗?

5个回答

279
你应该看一下pipdeptree
$ pip install pipdeptree
$ pipdeptree -fl
Warning!!! Cyclic dependencies found:
------------------------------------------------------------------------
xlwt==0.7.5
ruamel.ext.rtf==0.1.1
xlrd==0.9.3
openpyxl==2.0.4
  - jdcal==1.0
pymongo==2.7.1
reportlab==3.1.8
  - Pillow==2.5.1
  - pip
  - setuptools

它不会直接生成requirements.txt文件,就像你所说的那样。然而,源代码(255行Python代码)应该相对容易修改以满足您的需求,或者您可以使用(如@MERose在pipdeptree 0.3 README中指出的):

pipdeptree --freeze  --warn silence | grep -P '^[\w0-9\-=.]+' > requirements.txt

pipdeptree 的 0.5 版本还支持使用 --json 选项输出 JSON 格式,这种格式更容易被机器解析,但可读性较差。


根据https://pypi.python.org/pypi/pipdeptree/0.3,`pipdeptree | grep -P '^\w+'`命令会打印出一个requirements.txt文件。 - MERose
@MERose 感谢您指出这一点。我写这篇文章时可能还在使用0.2版本。 - Anthon
它在 bokeh 上无法工作 :( 这个包有特定的要求组织,因此 pip 不显示它们,但 conda 显示。 - Sklavit
现在它可以直接使用 --freeze 标志生成 requirements.txt 文件。 - Wasi Master
截至2022年,该项目已不再维护,并且不兼容较新的pip和py311。 - sorin

11

警告:仅支持py2 / 废弃

yolk可以显示包的依赖关系,前提是它们通过setuptools安装,并且附带有包括依赖信息的元数据。

  • 通过setuptools安装
  • 包含包的元数据中包括依赖信息

  • $ yolk -d Theano
    Theano 0.6.0rc3
      scipy>=0.7.2
      numpy>=1.5.0
    

我不确定是否存在完整的解决方案 - 问题在于依赖信息并不总是存在(例如通过distutils安装的软件包,它不支持软件包元数据)。 - ali_m
5
截至目前为止,Yolk还不支持Py3k。 - yegle
有人已经完成了端口转换:https://pypi.org/project/yolk3k/ - vokimon

8

您可以通过安装pipdeptree包来完成此操作。

在您的项目文件夹中打开命令提示符。如果您使用任何虚拟环境,请切换到该虚拟环境。

使用pip安装pipdeptree

pip install pipdeptree
pipdeptree -fl

这个软件包将列出您项目的所有依赖项。

更多信息请参考pipdeptree

图片描述


5

我知道这个问题已经过去了很多年,但它在我的搜索中出现了,所以我想分享一些知识。

pip-tools包含一个名为pip-compile的工具,似乎也解决了原始帖子作者的问题。

pip-compile接受一个输入文件,可以是setup.py、setup.cfg、pyproject.toml或requirements.in。输入文件是您手动编写的,包含“直接”依赖项。它可能不指定确切的依赖版本,但可能使用版本范围(也可能没有任何约束)。该工具会输出一个新的requirements.txt文件,其中添加了所有的间接依赖,并将依赖项锁定到确切的版本。

如果在更新源文件后再次运行pip-compile工具,它将根据需要从输出文件中添加或删除依赖项。您还可以选择通过添加标志来升级特定的依赖项。

因此,虽然pip-compile不会向您显示依赖关系树本身,但它可以帮助您收集依赖关系树的所有叶子节点(我认为这最终是原始帖子作者想要做的事情)。

了解更多信息: https://github.com/jazzband/pip-tools/


0
使用pip-compile命令来冻结requirements.in文件
Pip-tools v6.14.0似乎有一个pip-compile命令,可以默认生成带有注释的requirements.txt文件。我看到你只是想要冻结你的虚拟环境中安装的软件包,但更好的方法是有一个setup.py或requirements.in文件,你可以在其中写下你安装的软件包及其版本。
输出将类似于以下内容:
# requirements.txt
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
#    pip-compile --no-emit-index-url --output-file requirements.txt setup.py
#
my-private-package==2.3.0
    # via my-repo (setup.py)
alembic==1.7.4
    # via my-private-package-dep
amqp==2.6.1
    # via kombu

你还可以使用--no-annotate参数来关闭依赖注释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接