Existe-t-il un moyen de répertorier les dépendances / exigences de pip?

Réponses:

95

La réponse acceptée n'est plus pertinente pour les versions plus actuelles de pip et ne donne pas de réponse immédiate sans lire plusieurs commentaires, je fournis donc une réponse mise à jour.

Cela a été testé avec les versions de pip 8.1.2 , 9.0.1 , 10.0.1 et 18.1 .

Pour obtenir la sortie sans encombrer votre répertoire actuel sous Linux, utilisez

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

-d indique à pip le répertoire dans lequel le téléchargement doit placer les fichiers.

Mieux, utilisez simplement ce script avec l'argument étant le nom du package pour obtenir uniquement les dépendances en sortie:

#!/bin/sh

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

Aussi disponible ici .

Jmills
la source
Une lecture très ( très ) grossière de l' requirements.txtutilisation de ceci:< requirements.txt egrep -v "^#" | egrep -v "^$" | xargs -L 1 -I % sh -c 'echo %; echo "======"; ./deps.sh %; echo "";
Ian Clark
@ hans-musgrave a fait un bon point dans une autre réponse que je n'avais pas remarquée auparavant, donc mis à jour le script bash pour exclure uniquement les lignes qui correspondent au package avec la fin de la ligne ou le début d'un spécificateur de version valide plutôt que toute ligne qui contient le nom du package.
Jmills
2
Certains paquets ne fournissent que des binaires, ce --no-binary :all:n'est donc pas une bonne idée. Un projet qui ne livrait que wheel et non sdist échouerait.
wim
3
Cela finit par télécharger et compiler pour tous les paquets de dépendance qui peuvent être très lents ....
Louis Yang
1
Notez que cela ne répertorie pas les dépendances déjà installées (ce qui convient parfaitement à OP).
GPHemsley
66

Découvrez mon projet johnnydep !

Installation:

pip install johnnydep

Exemple d'utilisation:

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

Un arbre plus complexe:

$ 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
wim
la source
Je l'ai téléchargé et je l'utilise, c'est un excellent package. MAIS ne nécessite-t-il pas l'installation de packages? Le PO demande spécifiquement une approche qui ne nécessite pas d'installation. Important à mettre en garde.
so860
5
@ so860 Non, il ne nécessite pas l'installation des packages. C'est tout l'intérêt, cela fonctionne dans un environnement isolé.
wim
Pour être clair: s'installer johnnydepinstalle les dépendances.
GPHemsley
1
@wim: ce projet est un pur éclat! Aimer !
Jonathan DEKHTIAR
@JonathanDEKHTIAR merci pour les aimables paroles :)
wim
17

Si et seulement si le package est installé, vous pouvez utiliser pip show <package>. Recherchez le Requires:fichier à la fin de la sortie. De toute évidence, cela brise votre exigence, mais peut néanmoins être utile.

Par exemple:

$ 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
Sardathrion - contre les abus SE
la source
3
Cela ne montre que les exigences directes, toutes les dépendances transitives seraient manquantes. Et cela nécessite une installation. Donc, cela ne répond pas vraiment à la question.
wim
15

Remarque: la fonctionnalité utilisée dans cette réponse est obsolète en 2014 et supprimée en 2015 . Veuillez consulter les autres réponses qui s'appliquent à moderne pip.

Le plus proche que vous pouvez obtenir directement avec pip est d'utiliser l' --no-installargument:

pip install --no-install <package>

Par exemple, voici le résultat lors de l'installation du céleri:

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

Certes, cela laisse une certaine cruauté sous la forme de fichiers temporaires, mais cela atteint l'objectif. Si vous faites cela avec virtualenv (ce que vous devriez être), le nettoyage est aussi simple que de supprimer le <virtualenv root>/buildrépertoire.

Travis Mehlinger
la source
8
La raison en est que les métadonnées n'existent pas en dehors de setup.py, donc contrairement à dire avec rpmou dpkgoù vous créez un index de métadonnées sur le dessus et l'interrogez pipet pypine fonctionne pas de cette façon. Nous devons donc ignorer chaque exigence.
12
J'ai essayé pip --no-install celerymais je reçois l'erreur no such option: --no-install(pip 1.2.1)
Colonel Panic
4
Je pense qu'il voulait direpip install --no-install celery
entropie
23
Sur ma version pip (1.5.4), l' --no-installindicateur est obsolète.
Jian
4
Pour 1.5.4, utilisez pip install --download =.
no
-1

La commande pip install <package> --download <path>doit être utilisée, comme mentionné dans les commentaires de @radtek, car à partir de la version 7.0.0 (21/05/2015), --no-install est supprimé de pip. Cela téléchargera les dépendances nécessaires dans <path>.

toine
la source
10
Ridiculement, --downloada également été obsolète. La commande canonique semble maintenant être pip download <package> -d /tmp --no-binary :all:celle suggérée par The Card Cheat .
Cecil Curry
-1

Une autre option consiste à utiliser un script d'assistance similaire à celui-ci qui utilise l' pip.req.parse_requirementsAPI pour analyser les requirements.txtfichiers et un distutils.core.setupremplacement pour analyser les setup.pyfichiers.

sschuberth
la source
-1

Je cite une solution alternative de @onnovalkering :

PyPi fournit un point de terminaison JSON avec des métadonnées de package:

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

Pour une version de package spécifique, ajoutez un segment de version supplémentaire à l'URL:

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

De plus, si vous utilisez conda ( comme suggéré par @ShpielMeister ), vous pouvez utiliser:

conda info package==X.X.X

pour afficher des informations, y compris les dépendances d'une version particulière ou:

conda info package

pour afficher des informations, y compris les dépendances sur toutes les versions prises en charge de ce package.

pgmank
la source
1
J'ai voté contre parce que ce point de terminaison json n'est pas fiable. Pour un exemple boto3, le requires_dist est nul mais c'est un projet qui a certainement des dépendances dans les métadonnées .
wim