识别用pip安装的python包的依赖关系

Mar*_*ian 127 python pip

当我执行pip冻结时,我看到了大量的Python包,我没有明确安装,例如

$ pip freeze
Cheetah==2.4.3
GnuPGInterface==0.3.2
Landscape-Client==11.01
M2Crypto==0.20.1
PAM==0.4.2
PIL==1.1.7
PyYAML==3.09
Twisted-Core==10.2.0
Twisted-Web==10.2.0
(etc.)
Run Code Online (Sandbox Code Playgroud)

有没有办法让我确定为什么pip安装了这些特定的依赖包?换句话说,如何确定将这些包作为依赖项的父包?

例如,我可能想要使用Twisted,我不想依赖于包,直到我知道更多关于不小心卸载或升级它.

djs*_*tho 146

您可以尝试将依赖关系显示为树结构的pipdeptree,例如:

$ pipdeptree
Lookupy==0.1
wsgiref==0.1.2
argparse==1.2.1
psycopg2==2.5.2
Flask-Script==0.6.6
  - Flask [installed: 0.10.1]
    - Werkzeug [required: >=0.7, installed: 0.9.4]
    - Jinja2 [required: >=2.4, installed: 2.7.2]
      - MarkupSafe [installed: 0.18]
    - itsdangerous [required: >=0.21, installed: 0.23]
alembic==0.6.2
  - SQLAlchemy [required: >=0.7.3, installed: 0.9.1]
  - Mako [installed: 0.9.1]
    - MarkupSafe [required: >=0.9.2, installed: 0.18]
ipython==2.0.0
slugify==0.0.1
redis==2.9.1
Run Code Online (Sandbox Code Playgroud)

为了让它运行:

pip install pipdeptree
Run Code Online (Sandbox Code Playgroud)


编辑:正如@Esteban在评论中所指出的那样,你也可以反向列出树-r或用于单个包,-p <package_name>以便找到你可以运行的Werkzeug:

$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
  - Flask==0.12 [requires: Werkzeug>=0.7]
Run Code Online (Sandbox Code Playgroud)

  • 我相信完全回答你需要运行的@mark的问题:`pipdeptree -r`"以相反的方式显示依赖树,即子依赖关系列出了需要它们的包列表." (6认同)
  • pipdeptree 很棒,但只有在已经安装了软件包的情况下才有效。 (5认同)
  • `pipdeptree` 很棒。不幸的是,它似乎没有考虑 conda 安装的软件包的依赖关系:例如,在 conda 环境中,使用 pip 安装了 `matplotlib` 和 `numpy`,但是使用 conda 安装了 `scipy`,`scipy` 显示在pipdeptree 没有依赖项和依赖项(“pip show scipy”也没有显示任何要求)。 (2认同)
  • 要在虚拟环境中使用它,您需要执行“python -m pipdeptree”,否则(即使可执行文件安装到 virtualenv 中)它也只会列出系统依赖项。 (2认同)

Ber*_*ire 72

pip show命令将显示指定包所需的包(请注意,必须已安装指定的包):

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
Run Code Online (Sandbox Code Playgroud)

pip show 在pip版本1.4rc5中引入

  • 这并没有完全回答我的问题,因为它显示了特定包的子(依赖),而不是父.但是使用此命令将一些东西放在一起以检查每个包的依赖关系是很容易的.因此,例如,我可以确定哪个安装包需要PyYAML. (8认同)
  • 根据我之前的评论,这个shell命令会转储我每个已安装软件包的所有依赖项:$ pip freeze | grep -v"\ -e"| sed s /\=\=.*// | awk'系统("点子秀"$ 1)' (4认同)

Max*_* R. 12

正如我最近在一个线程中所说,我会推荐以下内容:

有一个requirements.txt带有主要依赖项的注释文件:

## this is needed for whatever reason
package1
Run Code Online (Sandbox Code Playgroud)

安装你的依赖项:pip install -r requirements.txt.现在,您将获得依赖项的完整列表pip freeze -r requirements.txt:

## this is needed for whatever reason
package1==1.2.3

## The following requirements were added by pip --freeze:
package1-dependency1==1.2.3
package1-dependency1==1.2.3
Run Code Online (Sandbox Code Playgroud)

这允许您使用注释保留文件结构,很好地将依赖项与依赖项的依赖项分开.这样你就可以在你需要删除其中一个的时候有更好的时间:)

请注意以下事项:

  • 您可以使用干净requirements.raw的版本控制来重建完整版requirements.txt.
  • 小心在过程中用鸡蛋名称替换git url.
  • 依赖关系的依赖关系仍按字母顺序排序,因此您不直接知道哪个包需要哪个,但此时您并不真正需要它.
  • 使用pip install --no-install <package_name>列出具体要求.
  • 如果不这样做,请使用virtualenv.

  • 小注意事项:“pip install”不再支持“--no-install”。 (5认同)
  • 我只是不明白为什么这个``pip freeze -r requirements.txt`` 没有被广泛使用。对于维护依赖项和子依赖项非常有用。 (2认同)

小智 11

以下命令将显示所有已安装软件包的要求:

pip3 freeze | awk '{print $1}' | cut -d '=' -f1 | xargs pip3 show
Run Code Online (Sandbox Code Playgroud)


小智 7

您还可以使用一行命令来管理pip show中的需求包.

cut -d'=' -f1 requirements.txt | xargs pip show
Run Code Online (Sandbox Code Playgroud)