识别与pip一起安装的python包的依赖关系

2024-06-01 13:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

当我执行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,我不想依赖于一个包,直到我知道更多关于不意外卸载或升级它的信息。


Tags: pipcoreclientwebpiletctwistedpyyaml
3条回答

您可以尝试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 show命令将显示指定包所需的包(注意,必须已安装指定包):

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

在pip版本1.4rc5中引入了pip show

正如我最近在一篇hn thread文章中所说,我将推荐以下内容:

有一个带有注释的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

这允许您保留带有注释的文件结构,很好地将依赖项与依赖项的依赖项分离开来。这样,你就有了一个更好的时间,一天,你需要删除其中一个:)

注意以下几点:

  • 您可以使用带有版本控制的干净requirements.raw来重新生成完整的requirements.txt
  • 当心git url在这个过程中被egg名称替换。
  • 依赖项的依赖项仍按字母顺序排序,因此您不直接知道哪个包需要哪个包,但此时您并不真正需要它。
  • 使用pip install --no-install <package_name>列出特定需求。
  • 如果没有,请使用virtualenv

相关问题 更多 >