我有一个具有多个包依赖项的项目,主要要求列在
requirements.txt
中。当我调用 pip freeze
时,它会将当前安装的软件包打印为简单列表。我还希望获得他们的依赖关系,如下所示:
Flask==0.9
Jinja2==2.7
Werkzeug==0.8.3
Jinja2==2.7
Werkzeug==0.8.3
Flask-Admin==1.0.6
Flask==0.9
Jinja2==2.7
Werkzeug==0.8.3
目标是检测每个特定包的依赖关系:
Werkzeug==0.8.3
Flask==0.9
Flask-Admin==1.0.6
并将这些插入到我当前的
requirements.txt
中。例如,对于此输入:
Flask==0.9
Flask-Admin==1.0.6
Werkzeug==0.8.3
我想得到:
Flask==0.9
Jinja2==2.7
Flask-Admin==1.0.6
Werkzeug==0.8.3
有没有办法显示已安装的pip包的依赖关系?
pipdeptree
:
$ pip install pipdeptree
$ pipdeptree -fl
Warning!!! Cyclic dependencies found:
------------------------------------------------------------------------
xlwt==0.7.5
ruamel.ext.rtf==0.1.1
xlrd==0.9.3
openpyxl==2.0.4
- jdcal==1.0
pymongo==2.7.1
reportlab==3.1.8
- Pillow==2.5.1
- pip
- setuptools
它不会生成您直接指示的
requirements.txt
文件。然而,源代码(255 行 python 代码)应该相对容易修改以满足您的需求,或者您也可以(如 @MERose 在 pipdeptree 0.3 README 中指出的那样)使用:
pipdeptree --freeze --warn silence | grep -P '^[\w0-9\-=.]+' > requirements.txt
0.5 版本的
pipdeptree
还允许使用 --json
选项进行 JSON 输出,这更容易被机器解析,但代价是可读性较差。
yolk
可以显示包的依赖关系,前提是它们
setuptools
附带包含依赖信息的元数据
$ yolk -d Theano
Theano 0.6.0rc3
scipy>=0.7.2
numpy>=1.5.0
您可以通过安装
pipdeptree
包来做到这一点。
在项目文件夹中打开命令提示符。如果您正在使用任何虚拟环境,请切换到该虚拟环境。
使用 pip 安装
pipdeptree
包
pip install pipdeptree
pipdeptree -fl
此包将列出您项目的所有依赖项。
了解更多pipdeptree
我意识到这个问题已经过去很多年了,但它出现在我的搜索中,所以我想我应该分享一些知识。
pip-tools
软件包包含一个名为pip-compile
的工具,它似乎也解决了原始海报的问题。
pip-compile
采用输入文件,可以是setup.py、setup.cfg、pyproject.toml或requirements.in。输入文件是您手写的文件,包含“直接”依赖项。它可能不会指定确切的依赖版本,但可能会使用版本范围(也可能根本没有限制)。该工具输出一个新的 rquirements.txt 文件,其中添加了所有间接依赖项,并将依赖项固定到确切的版本。
如果您在更新源文件后再次运行
pip-compile
工具,它将根据需要在输出文件中添加或删除依赖项。您还可以选择通过添加标志来升级特定依赖项。
因此,虽然
pip-compile
不向您显示依赖关系树本身,但它可以帮助您收集依赖关系树的所有叶子(我认为这就是原始发布者最终想要做的事情)。
在此处了解更多信息:https://github.com/jazzband/pip-tools/
Pip-tools v6.14.0 似乎有 pip-compile 命令来默认生成带注释的
requirements.txt
文件。我看到您只是打算从 virtualenv 冻结已安装的软件包,但更好的方法是有一个 setup.py
或 requirements.in
文件,您可以在其中使用版本编写已安装的软件包。
输出将类似于以下内容:
# requirements.txt
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
# pip-compile --no-emit-index-url --output-file requirements.txt setup.py
#
my-private-package==2.3.0
# via my-repo (setup.py)
alembic==1.7.4
# via my-private-package-dep
amqp==2.6.1
# via kombu
您还可以使用
--no-annotate
arg 关闭依赖注释。
如果您使用诗歌,您将在
poetry.lock
文件的[package.dependencies]
部分中看到依赖关系树
例如:
[[package]]
name = "requests"
version = "2.31.0"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.7"
files = [
{file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
{file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
]
[package.dependencies]
certifi = ">=2017.4.17"
charset-normalizer = ">=2,<4"
idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<3"