识别通过pip安装的Python包的依赖关系

279 投票
10 回答
164960 浏览
提问于 2025-04-17 12:47

当我运行 pip freeze 命令时,我看到了一大堆我并没有明确安装的 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,但在我了解更多信息之前,我不想依赖某个包,以免不小心卸载或升级它。

10 个回答

27

最近我在一个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

这样可以让你的文件结构更清晰,注释也能帮助你把自己的依赖和它们的依赖分开。这样,当你需要删除某个依赖时,会轻松很多 :)

注意以下几点:

  • 你可以有一个干净的 requirements.raw 文件,方便版本控制,以便重新生成完整的 requirements.txt
  • 要小心,git 地址在这个过程中可能会被替换成 egg 名称。
  • 依赖的依赖仍然是按字母顺序排列的,所以你不一定能直接知道哪个包是由哪个依赖的,但这时候你其实也不需要知道。
  • 使用 pip install --no-install <package_name> 来列出特定的需求。
  • 如果你还没有使用的话,建议用virtualenv
129

pip show 这个命令可以显示某个指定包所需要的其他包(注意,指定的包必须已经安装好)。

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

pip show 是在 pip 版本 1.4rc5 中引入的。

371

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

撰写回答