web-dev-qa-db-fra.com

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

Sans passer par l'installation, je veux voir rapidement tous les paquets que pip install installerait.

60
lastoneisbearfood

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

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 des traces sous la forme de fichiers temporaires, mais cela permet d’atteindre le but recherché. Si vous faites cela avec virtualenv (ce que vous devriez être), le nettoyage est aussi simple que de supprimer le répertoire <virtualenv root>/build.

16
Travis Mehlinger

La réponse acceptée n'est plus pertinente pour les versions les plus récentes de pip et ne donne pas une 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

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

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

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

#!/bin/sh

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

Aussi disponible ici .

81
Jmills

Découvrez 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
15
wim

Si et seulement si le package est installé, vous pouvez utiliser pip show <package>. Recherchez le Requires: classé à la fin de la sortie. Clairement, cela casse votre exigence mais pourrait 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
12
Sardathrion

Une autre option consiste à utiliser un script d'assistance similaire à celui-ci qui utilise l'API pip.req.parse_requirements pour analyser les fichiers requirements.txt et un remplacement distutils.core.setup pour analyser les fichiers setup.py.

0
sschuberth

La réponse de @Jmills est stellaire. Il y a un bogue dans la correspondance négative qui fait que certaines dépendances sont manquantes. Afin de s'assurer qu'un package n'est pas marqué comme une dépendance en soi, il a inclus la ligne grep -v $PACKAGE, qui correspond également négativement à toute dépendance avec le nom du package d'origine en tant que sous-chaîne} jupyter_core n'est pas répertorié en tant que dépendance de jupyter, par exemple.

Pour mon cas d'utilisation, j'ai trouvé utile d'avoir une implémentation en code python au lieu d'un script Shell. Je n'ai pas inclus le bogue d'origine, même si n'importe qui est libre de le rajouter s'il le souhaite. J'ai emprunté un gestionnaire de contexte stdout capturing pour rendre la collecte de dépendance plus intuitive.

from cStringIO import StringIO
import sys
import pip

class Capturing(list):
    def __enter__(self):
        self._stdout = sys.stdout
        sys.stdout = self._stringio = StringIO()
        return self
    def __exit__(self, *args):
        self.extend(self._stringio.getvalue().splitlines())
        del self._stringio    # free up some memory
        sys.stdout = self._stdout

def get_dependencies(module_name):
    with Capturing() as out:
        pip.main(['download', module_name, '-d', '/tmp', '--no-binary', ':all:'])
    return [line.split(' ')[1] for line in out if 'Collecting' == line[:10]][1:]

Si vous n'avez pas besoin des numéros de version, ceux-ci sont assez faciles à filtrer.

import re

def module_name(module_name_with_version):
    return re.match('[^!<>=]*', module_name_with_version).group()
0
Hans Musgrave

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

0
toine