当我执行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.)

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

例如,我可能想要使用Twisted,并且我不想依赖于一个包,直到我更了解如何避免意外卸载或升级它。


当前回答

你可以尝试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

让它运行:

pip install pipdeptree

编辑:正如@Esteban在评论中指出的那样,你也可以用-r反向列出树,或者用-p <package_name>列出单个包,这样就可以找到安装的Werkzeug:

$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
  - Flask==0.12 [requires: Werkzeug>=0.7]

其他回答

首先,pip冻结显示当前安装的所有Python包,不一定使用pip。

其次,Python包确实包含有关依赖包以及所需版本的信息。您可以使用这里描述的方法查看特定pkg的依赖关系。当你升级一个包时,像PIP这样的安装程序脚本将为你处理依赖项的升级。

为了解决包的更新问题,我建议使用PIP需求文件。您可以定义所需的软件包和版本,并使用pip install立即安装它们。

您还可以使用一行命令,将需求中的包输送到pip show。

cut -d'=' -f1 requirements.txt | xargs pip show

pip show命令将显示指定的包需要哪些包(注意指定的包必须已经安装):

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

PIP show在PIP版本1.4rc5中引入

就像我最近在hn线程上说的,我将推荐以下内容:

创建一个带有注释的requirements.txt文件,其中包含你的主要依赖项:

## this is needed for whatever reason
package1

安装你的依赖项: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

这允许你用注释来保持你的文件结构,很好地将你的依赖关系和依赖关系的依赖关系分开。这样你就可以在你需要移除其中一个的那天过得更愉快:)

注意事项:

你可以有一个干净的要求。Raw与版本控制,以重建您的完整需求。txt。 小心git url在此过程中被egg名称替换。 依赖项的依赖项仍然是按字母顺序排序的,因此您不能直接知道哪个包需要哪个依赖项,但此时您并不真正需要它。 使用pip install——no-install <package_name>列出具体要求。 如果不需要,可以使用virtualenv。

你可以尝试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

让它运行:

pip install pipdeptree

编辑:正如@Esteban在评论中指出的那样,你也可以用-r反向列出树,或者用-p <package_name>列出单个包,这样就可以找到安装的Werkzeug:

$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
  - Flask==0.12 [requires: Werkzeug>=0.7]