识别通过pip安装的Python包的依赖关系
当我运行 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]