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

我有一个具有多个包依赖项的项目,主要需求在 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 软件包的依赖关系?

79516 次浏览

警告: 只有 py2/废弃件

yolk 可以显示包的依赖项,只要它们

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

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

你应该看看 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 在 pideptree 0.3 README 中指出的那样)使用:

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

pipdeptree的0.5版本还允许带有 --json选项的 JSON 输出,这样更容易进行机器解析,但代价是可读性降低。

可以通过安装 pipdeptree软件包来实现。

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

使用 pip 安装 pipdeptree

pip install pipdeptree
pipdeptree -fl

此包将列出项目的所有依赖项。

为了更多的 小树

enter image description here

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

pip-tools包含一个称为 pip-compile的工具,似乎也解决了原始海报的问题。

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

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

因此,虽然 pip-compile没有显示依赖树本身,但它可以帮助您收集依赖树的所有叶子(我假设这是原始海报最终想要做的)。

阅读更多: https://github.com/jazzband/pip-tools/