有没有办法列出点子的依赖关系/要求?


Answers:


95

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

这与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(~|=|\!|>|<|$)"

也可以在这里


使用此方法的非常(非常)粗略的阅读requirements.txt< requirements.txt egrep -v "^#" | egrep -v "^$" | xargs -L 1 -I % sh -c 'echo %; echo "======"; ./deps.sh %; echo "";
伊恩·克拉克

@ hans-musgrave在我之前未曾注意到的另一个答案中指出了一个要点,因此更新了bash脚本以仅排除与软件包匹配的行,行尾或有效版本说明符的开头,而不是任何与包含软件包名称。
Jmills

2
有些软件包提供二进制文件,因此--no-binary :all:不是一个好主意。仅运送车轮而不运送sdist的项目将失败。
WIM

3
为此加快下载和编译所有的依赖包可以是非常慢....
路易斯阳

1
请注意,这不会列出已安装的依赖项(这对于OP来说很好)。
GPHemsley

66

看看我的项目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

我下载并使用了它,它是一个很棒的程序包。但是,它不需要安装软件包吗?OP特别要求一种不需要安装的方法。注意事项很重要。
so860

5
@ so860否,它不需要安装软件包。这就是重点,它可以在隔离的环境中工作。
wim

需要明确的是:安装johnnydep本身会安装依赖项。
GPHemsley,

1
@wim:这个项目纯属辉煌!爱它 !
乔纳森·德克提亚

@JonathanDEKHTIAR谢谢您的客气:)
wim

15

仅当软件包已安装时,您才可以使用pip show <package>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

3
这仅显示直接需求,所有传递依赖都将丢失。并且它需要安装。因此,它并不能真正回答问题。
6

15

注意:此答案中使用的功能于2014弃用,于2015删除。请参阅适用于现代语言的其他答案pip

您可以直接通过pip获得最接近的--no-install参数:

pip install --no-install <package>

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

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(应该如此)执行此操作,则清除就像删除<virtualenv root>/build目录一样容易。


8
这样做的原因是,元数据不存在setup.py外侧,以便与不同的发言权rpm或者dpkg,你在上面,查询建立元数据索引pippypi不工作的方式。因此,我们必须跳过每个要求。

12
我尝试了pip --no-install celery但收到错误消息no such option: --no-install(pip 1.2.1)
Panic Panic

4
我认为他是说pip install --no-install celery

23
在我的pip版本(1.5.4)中,该--no-install标志已弃用。

4
对于1.5.4,请使用pip install --download =。-不使用车轮芹菜
radtek

-1

该命令pip install <package> --download <path>应当使用,如通过在@radtek评论提到的,由于作为7.0.0(2015年5月21日),--no安装被除去pip。这会将所需的依赖项下载到中<path>


10
可笑的是,它--download也被弃用了。现在,规范命令似乎与“卡片欺诈”pip download <package> -d /tmp --no-binary :all:建议的一样。
塞西尔·库里

-1

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


-1

我引用@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.*'

对于特定的软件包版本,请在URL中添加一个附加的版本段:

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

另外,如果您使用的是conda如@ShpielMeister所建议),则可以使用:

conda info package==X.X.X

显示信息,包括特定版本的依存关系,或:

conda info package

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


1
我拒绝投票,因为此json端点不可靠。例如boto3,require_dist为null,但这是一个肯定在元数据中具有依赖项的项目。
wim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.