有什么方法可以显示pip包的依赖关系树吗?


91

我有一个具有多个程序包依赖项的项目,其主要要求在中列出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软件包的依赖性?


我知道您是四年前问过这个问题的,并且努力地将您迅速得到的答案标记为最佳答案。谢谢你这样做。但是,我将看看您一年后从Anthon那里获得的答案。pipdeptree很棒!!!显然,@ naiquevin自2015年4月以来就没有加入过,但是他在这里创建了一个非常不错的工具。
Rob Fagen

Answers:


137

您应该看一下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代码)应该相对容易地根据您的需要进行修改,或者您也可以(如pipdeptree 0.3 README中的@MERose所示)停用:

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

的0.5版本pipdeptree还允许使用带有--json选项的JSON输出,该选项更易于机器解析,但以降低可读性为代价。


根据pypi.python.org/pypi/pipdeptree/0.3,显示pipdeptree | grep -P '^\w+'了requirements.txt。
MERose

@MERose感谢您指出这一点。撰写本文时,我肯定仍在使用0.2版。
Anthon

它不适用于bokeh:(此软件包具有特定的要求组织,因此pip不会显示要求,但
conda会

12

警告:仅限py2 /放弃软件

yolk 可以显示软件包的依赖关系,前提是它们

  • 通过安装 setuptools
  • 带有包含依赖项信息的元数据

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

谢谢。这不是完整的解决方案,但是实用的工具。
tbicr

我不确定是否有完整的解决方案-问题是依赖关系信息并不总是存在(例如,对于通过进行安装的软件包distutils,它不支持软件包元数据)
ali_m 2013年

5
截至撰写本文时,yolk还没有py3k支持。
yegle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.