Чи є спосіб перерахувати залежності / вимоги pip?


99

Не закінчуючи встановлення, я хочу швидко переглянути всі пакети, які pip installвстановлюватимуться.



1
Може, жовток може допомогти?
jadkik94

Інше питання , в тому числі альтернативні відповіді на цю проблему: stackoverflow.com/questions/41816693 / ...
pgmank

Відповіді:


95

Прийнята відповідь більше не актуальна для більш сучасних версій pip і не дає негайної відповіді без перегляду кількох коментарів, тому я надаю оновлену відповідь.

Це було протестовано з версіями pip 8.1.2 , 9.0.1 , 10.0.1 та 18.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

17

Якщо і тільки якщо пакет встановлений, ви можете використовувати 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
Це показує лише прямі вимоги, відсутні всі перехідні залежності. І це вимагає установки. Отже, це насправді не відповідає на питання.
Вім

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де ви будуєте індекс метаданих зверху і запит , що pipі pypiне працюєте. Тож ми повинні передати кожну вимогу.

12
Я спробував, pip --no-install celeryале отримую помилку no such option: --no-install(пункт 1.2.1)
Полковник Панік,

4
Думаю, він мав на увазіpip install --no-install celery
ентропію

23
У моїй піп-версії (1.5.4) --no-installпрапор застарілий.
Цзянь

4
Для 1.5.4 використовуйте pip install --download =. - селера без використання колеса
радтек

-1

Команда pip install <package> --download <path>повинна використовуватися, як згадується в коментарях @radtek, оскільки станом на 7.0.0 (21.05.2015), --no-install видалено з 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.