有没有办法列出 pip 依赖项/要求?

Posted

技术标签:

【中文标题】有没有办法列出 pip 依赖项/要求?【英文标题】:Is there a way to list pip dependencies/requirements? 【发布时间】:2012-06-24 05:58:30 【问题描述】:

在不进行安装的情况下,我想快速查看pip install 将安装的所有包。

【问题讨论】:

相关:***.com/q/9232568/183791 另一个问题,包括此问题的替代答案:***.com/questions/41816693/… 【参考方案1】:

接受的答案不再与最新版本的 pip 相关,并且在不仔细阅读多个 cmets 的情况下不会立即给出答案,因此我提供了更新的答案。

这是用 pip 版本 8.1.29.0.110.0.118.1 测试的>.

要在不弄乱 Linux 上的当前目录的情况下获取输出,请使用

pip download [package] -d /tmp --no-binary :all: -v

-d 告诉 pip 下载文件的目录。

更好的是,只需使用此脚本,参数为包名即可仅获取依赖项作为输出:

#!/bin/sh

PACKAGE=$1
pip download $PACKAGE -d /tmp --no-binary :all:-v 2>&1 \
| grep Collecting \
| cut -d' ' -f2 \
| grep -Ev "$PACKAGE(~|=|\!|>|<|$)"

也可以使用here。

【讨论】:

requirements.txt 的非常(very)粗略解读:&lt; requirements.txt egrep -v "^#" | egrep -v "^$" | xargs -L 1 -I % sh -c 'echo %; echo "======"; ./deps.sh %; echo ""; @hans-musgrave 在另一个我之前没有注意到的答案中提出了一个很好的观点,因此更新了 bash 脚本以仅排除与包匹配的行以及行尾或开头有效的version specifier 而不是包含包名的任何行。 一些包提供二进制,所以--no-binary :all:不是一个好主意。只提供 wheel 而不是 sdist 的项目会失败。 这最终会下载并编译所有可能非常慢的依赖包.... 请注意,这并没有列出已经安装的依赖项(这对 OP 来说很好)。【参考方案2】:

查看我的项目johnnydep!

安装:

pip install johnnydep

使用示例:

$ johnnydep requests
name                       summary
-------------------------  ----------------------------------------------------------------------
requests                   Python HTTP for Humans.
├── certifi>=2017.4.17     Python package for providing Mozilla's CA Bundle.
├── chardet<3.1.0,>=3.0.2  Universal encoding detector for Python 2 and 3
├── idna<2.7,>=2.5         Internationalized Domain Names in Applications (IDNA)
└── urllib3<1.23,>=1.21.1  HTTP library with thread-safe connection pooling, file post, and more.

更复杂的树:

$ johnnydep ipython 
name                              summary
--------------------------------  -----------------------------------------------------------------------------
ipython                           IPython: Productive Interactive Computing
├── appnope                       Disable App Nap on OS X 10.9
├── decorator                     Better living through Python with decorators
├── jedi>=0.10                    An autocompletion tool for Python that can be used for text editors.
│   └── parso==0.1.1              A Python Parser
├── pexpect                       Pexpect allows easy control of interactive console applications.
│   └── ptyprocess>=0.5           Run a subprocess in a pseudo terminal
├── pickleshare                   Tiny 'shelve'-like database with concurrency support
├── prompt-toolkit<2.0.0,>=1.0.4  Library for building powerful interactive command lines in Python
│   ├── six>=1.9.0                Python 2 and 3 compatibility utilities
│   └── wcwidth                   Measures number of Terminal column cells of wide-character codes
├── pygments                      Pygments is a syntax highlighting package written in Python.
├── setuptools>=18.5              Easily download, build, install, upgrade, and uninstall Python packages
├── simplegeneric>0.8             Simple generic functions (similar to Python's own len(), pickle.dump(), etc.)
└── traitlets>=4.2                Traitlets Python config system
    ├── decorator                 Better living through Python with decorators
    ├── ipython-genutils          Vestigial utilities from IPython
    └── six                       Python 2 and 3 compatibility utilities

【讨论】:

@so860 不,它不需要安装软件包。这就是重点,它在一个孤立的环境中工作。 @wim:这个项目真是太棒了!喜欢它! 这似乎是一个不错的软件包,但它确实似乎安装了这些软件包。当然,在单独的环境中,但它仍然必须在那里实际安装包,当有很多包时,这很慢,如果安装包失败,它就会失败。所以我认为不通过安装过程就可以看到依赖项的OP要求。 @BenFarmer 那不正确。它不安装包,它从wheel 文件中读取元数据,这确实需要包下载——但不需要安装。在极少数情况下,项目发布了源分发但没有兼容的***可用,然后 pip 将尝试从 sdist 生成***(即来自 sdist 的the only reliable way to get package metadata)。在最常见的情况下,没有安装过程。 @GPHemsley .. 它有相当多的依赖关系,请参阅 pip show: Requires: structlog, wheel, setuptools, wimpy, cachetools, anytree, distlib, tabulate, colorama, pip, packaging, toml, pkginfo, oyaml【参考方案3】:

当且仅当安装包时,您可以使用pip show &lt;package&gt;。查找输出末尾的Requires:。显然,这违反了您的要求,但仍然可能有用。

例如:

$ pip --version
pip 7.1.0 [...]
$ pip show pytest
---
Metadata-Version: 2.0
Name: pytest
Version: 2.7.2
Summary: pytest: simple powerful testing with Python
Home-page: http://pytest.org
Author: Holger Krekel, Benjamin Peterson, Ronny Pfannschmidt, Floris Bruynooghe and others
Author-email: holger at merlinux.eu
License: MIT license
Location: /home/usr/.tox/develop/lib/python2.7/site-packages
Requires: py

【讨论】:

这仅显示直接需求,所有传递依赖都将丢失。它需要安装。所以,它并没有真正回答这个问题。【参考方案4】:

注意:此答案中使用的功能是deprecated in 2014 和removed in 2015。请查看适用于现代pip 的其他答案。

您可以直接使用 pip 最接近的是使用 --no-install 参数:

pip install --no-install <package>

例如,这是安装 celery 时的输出:

Downloading/unpacking celery                                                                                   
  Downloading celery-2.5.5.tar.gz (945Kb): 945Kb downloaded
  Running setup.py egg_info for package celery

    no previously-included directories found matching 'tests/*.pyc'
    no previously-included directories found matching 'docs/*.pyc'
    no previously-included directories found matching 'contrib/*.pyc'
    no previously-included directories found matching 'celery/*.pyc'
    no previously-included directories found matching 'examples/*.pyc'
    no previously-included directories found matching 'bin/*.pyc'
    no previously-included directories found matching 'docs/.build'
    no previously-included directories found matching 'docs/graffles'
    no previously-included directories found matching '.tox/*'
Downloading/unpacking anyjson>=0.3.1 (from celery)
  Downloading anyjson-0.3.3.tar.gz
  Running setup.py egg_info for package anyjson

Downloading/unpacking kombu>=2.1.8,<2.2.0 (from celery)
  Downloading kombu-2.1.8.tar.gz (273Kb): 273Kb downloaded
  Running setup.py egg_info for package kombu

Downloading/unpacking python-dateutil>=1.5,<2.0 (from celery)
  Downloading python-dateutil-1.5.tar.gz (233Kb): 233Kb downloaded
  Running setup.py egg_info for package python-dateutil

Downloading/unpacking amqplib>=1.0 (from kombu>=2.1.8,<2.2.0->celery)
  Downloading amqplib-1.0.2.tgz (58Kb): 58Kb downloaded
  Running setup.py egg_info for package amqplib

Successfully downloaded celery anyjson kombu python-dateutil amqplib

诚然,这确实以临时文件的形式留下了一些麻烦,但它确实实现了目标。如果您使用 virtualenv(您应该这样做)执行此操作,那么清理就像删除 &lt;virtualenv root&gt;/build 目录一样简单。

【讨论】:

原因是元数据在 setup.py 之外不存在,所以不像 rpmdpkg 在上面构建元数据索引并查询 pippypi 不能那样工作。所以我们必须忽略每一个要求。 我试过pip --no-install celery,但收到错误no such option: --no-install (pip 1.2.1) 我认为他的意思是pip install --no-install celery 在我的 pip 版本 (1.5.4) 上,--no-install 标志已弃用。 对于 1.5.4,使用 pip install --download=。 --no-use-wheel celery【参考方案5】:

我引用alternative solution from @onnovalkering:

PyPi 提供带有包元数据的 JSON 端点:

>>> import requests
>>> url = 'https://pypi.org/pypi//json'
>>> json = requests.get(url.format('pandas')).json()
>>> json['info']['requires_dist']
['numpy (>=1.9.0)', 'pytz (>=2011k)', 'python-dateutil (>=2.5.0)']
>>> json['info']['requires_python']
'>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*'

对于特定的包版本,添加一个额外的版本段到 网址:

https://pypi.org/pypi/pandas/0.22.0/json

另外,如果你使用 conda (as suggested by @ShpielMeister),你可以使用:

conda info package==X.X.X

显示信息,包括特定版本的依赖项或:

conda info package

显示信息,包括该软件包所有受支持版本的依赖关系。

【讨论】:

我投了反对票,因为这个 json 端点不可靠。例如看boto3,requires_dist 为空,但这是certainly has dependencies in the metadata 的项目。【参考方案6】:

使用pipdeptree (pip install pipdeptree)。需要安装包。

$ pipdeptree -p pandas
pandas==1.2.2
  - numpy [required: >=1.16.5, installed: 1.19.5]
  - python-dateutil [required: >=2.7.3, installed: 2.8.1]
    - six [required: >=1.5, installed: 1.15.0]
  - pytz [required: >=2017.3, installed: 2021.1]

使用johnnydep (pip install johnnydep)。速度较慢,因为它会下载软件包的***。

$ johnnydep pandas
2021-06-09 11:01:21 [info     ] init johnnydist                [johnnydep.lib] dist=pandas parent=None
2021-06-09 11:01:22 [info     ] init johnnydist                [johnnydep.lib] dist=numpy>=1.16.5 parent=pandas
2021-06-09 11:01:22 [info     ] init johnnydist                [johnnydep.lib] dist=python-dateutil>=2.7.3 parent=pandas
2021-06-09 11:01:23 [info     ] init johnnydist                [johnnydep.lib] dist=pytz>=2017.3 parent=pandas
2021-06-09 11:01:23 [info     ] init johnnydist                [johnnydep.lib] dist=six>=1.5 parent=python-dateutil>=2.7.3
name                        summary
--------------------------  -----------------------------------------------------------------------
pandas                      Powerful data structures for data analysis, time series, and statistics
├── numpy>=1.16.5           NumPy is the fundamental package for array computing with Python.
├── python-dateutil>=2.7.3  Extensions to the standard Python datetime module
│   └── six>=1.5            Python 2 and 3 compatibility utilities
└── pytz>=2017.3            World timezone definitions, modern and historical

【讨论】:

【参考方案7】:

我认为这些答案已经过时,现在有更好的解决方案。原帖在这里:

How can I get a list of packages pip command will install without DOWNLOADING or INSTALLING the packages?

要为setup.cfgsetup.pyinstall_requires 中列出的包生成requirements.txt,您需要安装pip-tools

pip install pip-tools
pip-compile

要生成一个requirements.txt 文件,其中包含在extras_requires 下为testsdev 指定的包:

pip-compile --extra tests --extra devrequirements.txt file with packages listed under

此外,您还可以使用requirements.in 文件而不是setup.cfgsetup.py 来列出您的要求。

pip-compile requirements.in

【讨论】:

【参考方案8】:

应该使用命令 pip install &lt;package&gt; --download &lt;path&gt;,正如 @radtek 在 cmets 中提到的那样,因为从 7.0.0 (2015-05-21) 开始,--no-install 是来自 pip 的 removed。这会将所需的依赖项下载到&lt;path&gt;

【讨论】:

可笑的是,--download 也已被弃用。 规范命令 now 似乎是 pip download &lt;package&gt; -d /tmp --no-binary :all: suggested by @987654323 @.【参考方案9】:

另一种选择是使用类似于this one 的帮助脚本,它使用pip.req.parse_requirements API 来解析requirements.txt 文件并使用distutils.core.setup 替换来解析setup.py 文件。

【讨论】:

以上是关于有没有办法列出 pip 依赖项/要求?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法以编程方式列出所有 gradle 依赖项?

有没有办法以编程方式列出所有gradle依赖项?

有啥方法可以显示 pip 包的依赖树吗?

pip 需求文件中的可选依赖项

列出python包依赖项而不加载它们?

有没有办法用作曲家卸载开发依赖项?