Có cách nào để liệt kê các yêu cầu / phụ thuộc của pip không?


Câu trả lời:


95

Câu trả lời được chấp nhận không còn phù hợp với các phiên bản pip hiện tại hơn và không đưa ra câu trả lời ngay lập tức nếu không xem xét nhiều nhận xét, vì vậy tôi sẽ cung cấp câu trả lời cập nhật.

Điều này đã được thử nghiệm với các phiên bản pip 8.1.2 , 9.0.1 , 10.0.118.1 .

Để có được đầu ra mà không làm lộn xộn thư mục hiện tại của bạn trên Linux, hãy sử dụng

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

-d cho pip biết thư mục tải xuống sẽ đưa các tệp vào.

Tốt hơn, chỉ cần sử dụng tập lệnh này với đối số là tên gói để chỉ lấy các phần phụ thuộc làm đầu ra:

#!/bin/sh

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

Cũng có sẵn ở đây .


Một rất ( rất ) đọc thô requirements.txtsử dụng này:< requirements.txt egrep -v "^#" | egrep -v "^$" | xargs -L 1 -I % sh -c 'echo %; echo "======"; ./deps.sh %; echo "";
Ian Clark

@ hans-musgrave đã thực hiện một điểm tốt trong một câu trả lời khác mà tôi chưa nhận thấy trước đây, vì vậy đã cập nhật tập lệnh bash để chỉ loại trừ các dòng khớp với gói cùng với cuối dòng hoặc phần đầu của mã định phiên bản hợp lệ thay vì bất kỳ dòng nào chứa tên gói.
Jmills

2
Một số gói chỉ cung cấp nhị phân, vì vậy --no-binary :all:không phải là một ý kiến ​​hay. Một dự án chỉ vận chuyển bánh xe chứ không phải sdist sẽ thất bại.
wim

3
Mục đích này lên tải về và biên dịch cho tất cả các gói phụ thuộc mà có thể rất chậm ....
Louis Yang

1
Lưu ý rằng điều này không liệt kê các phụ thuộc đã được cài đặt (điều này tốt cho OP).
GPHemsley

66

Kiểm tra dự án của tôi johnnydep !

Cài đặt:

pip install johnnydep

Ví dụ sử dụng:

$ 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.

Một cây phức tạp hơn:

$ 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

Tôi đã tải xuống và sử dụng nó, đó là một gói tuyệt vời. NHƯNG nó không yêu cầu các gói phải được cài đặt? OP đang yêu cầu một cách cụ thể cách tiếp cận không yêu cầu cài đặt. Điều quan trọng cần báo trước.
so860,

5
@ so860 Không, nó không yêu cầu cài đặt các gói. Đó là toàn bộ điểm, nó hoạt động trong một môi trường cô lập.
wim

Để rõ ràng: cài đặt johnnydepchính nó cài đặt các phụ thuộc.
GPHemsley

1
@wim: dự án này là thuần túy! Yêu nó !
Jonathan DEKHTIAR

@JonathanDEKHTIAR cảm ơn bạn vì những lời tốt đẹp :)
wim

17

Nếu và chỉ khi gói được cài đặt, bạn có thể sử dụng pip show <package>. Tìm Requires:hồ sơ ở cuối đầu ra. Rõ ràng, điều này phá vỡ yêu cầu của bạn nhưng vẫn có thể hữu ích.

Ví dụ:

$ 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
Điều này chỉ hiển thị các yêu cầu trực tiếp, tất cả các phụ thuộc bắc cầu sẽ bị thiếu. Và nó yêu cầu cài đặt. Vì vậy, nó không thực sự trả lời câu hỏi.
wim

15

Lưu ý: tính năng được sử dụng trong câu trả lời này không được dùng vào năm 2014bị xóa vào năm 2015 . Vui lòng xem các câu trả lời khác áp dụng cho hiện đại pip.

Cách gần nhất bạn có thể nhận được với pip trực tiếp là sử dụng --no-installđối số:

pip install --no-install <package>

Ví dụ, đây là đầu ra khi cài đặt cần tây:

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

Phải thừa nhận rằng điều này để lại một số điểm mấu chốt ở dạng các tệp tạm thời, nhưng nó thực hiện được mục tiêu. Nếu bạn đang làm điều này với virtualenv (bạn nên làm như vậy), việc dọn dẹp cũng dễ dàng như xóa <virtualenv root>/buildthư mục.


8
Lý do cho điều này là siêu dữ liệu không tồn tại bên ngoài setup.py vì vậy không giống như nói với rpmhoặc dpkgnơi bạn tạo chỉ mục siêu dữ liệu ở trên cùng và truy vấn điều đó pippypikhông hoạt động theo cách đó. Vì vậy, chúng tôi phải vượt qua từng yêu cầu.

12
Tôi đã thử pip --no-install celerynhưng nhận được lỗi no such option: --no-install(pip 1.2.1)
Colonel Panic

4
Tôi nghĩ anh ấy có nghĩa làpip install --no-install celery
entropy

23
Trên phiên bản pip của tôi (1.5.4), --no-installcờ không được dùng nữa.
Jian

4
Đối với 1.5.4, sử dụng pip install --download =.
radtek

-1

Lệnh pip install <package> --download <path>nên được sử dụng, như đã đề cập trong nhận xét của @radtek, kể từ phiên bản 7.0.0 (2015-05-21), --no-install đã bị xóa khỏi pip. Điều này sẽ tải xuống các phụ thuộc cần thiết vào <path>.


10
Thật nực cười, --downloadđã không còn được dùng nữa. Lệnh kinh điển hiện nay dường như pip download <package> -d /tmp --no-binary :all:đề nghị của Thẻ Cheat .
Cecil Curry

-1

Một tùy chọn khác là sử dụng tập lệnh trợ giúp tương tự như tập lệnh này sử dụng pip.req.parse_requirementsAPI để phân tích cú pháp requirements.txttệp và distutils.core.setupthay thế để phân tích cú pháp setup.pytệp.


-1

Tôi trích dẫn một giải pháp thay thế từ @onnovalkering :

PyPi cung cấp một điểm cuối JSON với siêu dữ liệu gói:

>>> 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.*'

Đối với một phiên bản gói cụ thể, hãy thêm một phân đoạn phiên bản bổ sung vào URL:

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

Ngoài ra, nếu bạn đang sử dụng conda ( theo đề xuất của @ShpielMeister ), bạn có thể sử dụng:

conda info package==X.X.X

để hiển thị thông tin, bao gồm các phần phụ thuộc cho một phiên bản cụ thể hoặc:

conda info package

để hiển thị thông tin, bao gồm các phần phụ thuộc về tất cả các phiên bản được hỗ trợ của gói đó.


1
Tôi đã phản đối vì điểm cuối json này không đáng tin cậy. Đối với một ví dụ xem xét boto3, Requi_dist là null nhưng đó là một dự án chắc chắn có phụ thuộc vào siêu dữ liệu .
wim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.