¿Hay alguna forma de enumerar las dependencias / requisitos de pip?

Respuestas:

95

La respuesta aceptada ya no es relevante para las versiones más actuales de pip y no da una respuesta inmediata sin leer varios comentarios, por lo que proporciono una respuesta actualizada.

Esto se probó con las versiones de pip 8.1.2 , 9.0.1 , 10.0.1 y 18.1 .

Para obtener el resultado sin saturar su directorio actual en el uso de Linux

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

-d le dice a pip el directorio en el que la descarga debe colocar los archivos.

Mejor, simplemente use este script con el argumento como el nombre del paquete para obtener solo las dependencias como salida:

#!/bin/sh

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

También disponible aquí .

Jmills
fuente
Una lectura muy ( muy ) cruda de requirements.txtusar esto:< requirements.txt egrep -v "^#" | egrep -v "^$" | xargs -L 1 -I % sh -c 'echo %; echo "======"; ./deps.sh %; echo "";
Ian Clark
@ hans-musgrave hizo un buen punto en otra respuesta que no había notado anteriormente, así que actualicé el script bash para excluir solo las líneas que coinciden con el paquete junto con el final de la línea o el comienzo de un especificador de versión válido en lugar de cualquier línea que contiene el nombre del paquete.
Jmills
2
Algunos paquetes solo proporcionan binario, por --no-binary :all:lo que no es una buena idea. Un proyecto que solo enviara rueda y no sdist fracasaría.
wim
3
Esto termina descargando y compilando todos los paquetes de dependencia que pueden ser muy lentos ....
Louis Yang
1
Tenga en cuenta que esto no enumera las dependencias que ya están instaladas (lo cual está bien para OP).
GPHemsley
66

¡Mira mi proyecto johnnydep !

Instalación:

pip install johnnydep

Ejemplo de uso:

$ 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 árbol más complejo:

$ 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
fuente
Lo descargué y lo utilicé, es un gran paquete. ¿PERO no requiere que se instalen paquetes? El OP solicita específicamente un enfoque que no requiere instalación. Importante advertir.
so860
5
@ so860 No, no es necesario instalar los paquetes. Ese es el punto, funciona en un entorno aislado.
wim
Para ser claros: instalarse a johnnydepsí mismo instala dependencias.
GPHemsley
1
@wim: ¡este proyecto es pura genialidad! Quiéralo !
Jonathan DEKHTIAR
@JonathanDEKHTIAR gracias por las amables palabras :)
wim
17

Si y solo si el paquete está instalado, puede usar pip show <package>. Busque el Requires:archivo al final de la salida. Claramente, esto rompe su requisito, pero podría ser útil de todos modos.

Por ejemplo:

$ 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 - contra el abuso SE
fuente
3
Esto solo muestra los requisitos directos, faltarían todas las dependencias transitivas. Y requiere una instalación. Entonces, realmente no responde la pregunta.
wim
15

Nota: la función utilizada en esta respuesta quedó obsoleta en 2014 y se eliminó en 2015 . Consulte otras respuestas que se aplican a moderno pip.

Lo más cercano que puede obtener con pip directamente es usando el --no-installargumento:

pip install --no-install <package>

Por ejemplo, esta es la salida al instalar apio:

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

Es cierto que esto deja algo de espacio en forma de archivos temporales, pero logra el objetivo. Si está haciendo esto con virtualenv (que debería ser), la limpieza es tan fácil como eliminar el <virtualenv root>/builddirectorio.

Travis Mehlinger
fuente
8
La razón de esto es que los metadatos no existen fuera de setup.py, así que a diferencia de decir con rpmo dpkgdonde construyes un índice de metadatos en la parte superior y consultas eso pipy pypino funciona de esa manera. Así que tenemos que pasar por alto cada requisito.
12
Lo intenté pip --no-install celerypero recibo el error no such option: --no-install(pip 1.2.1)
Colonel Panic
4
Creo que quiso decirpip install --no-install celery
entropía
23
En mi versión de pip (1.5.4), la --no-installbandera está obsoleta.
Jian
4
Para 1.5.4, use pip install --download =.
radtek
-1

El comando pip install <package> --download <path>debe usarse, como se menciona en los comentarios de @radtek, ya que a partir de 7.0.0 (2015-05-21), --no-install se elimina de pip. Esto descargará las dependencias necesarias en <path>.

toine
fuente
10
Ridículamente, también --downloadse ha desaprobado. El comando canónica ahora parece estar pip download <package> -d /tmp --no-binary :all:como sugerido por la tarjeta de trucos .
Cecil Curry
-1

Otra opción es usar un script auxiliar similar a este que usa la pip.req.parse_requirementsAPI para analizar requirements.txtarchivos y un distutils.core.setupreemplazo para analizar setup.pyarchivos.

sschuberth
fuente
-1

Cito una solución alternativa de @onnovalkering :

PyPi proporciona un punto final JSON con metadatos de paquetes:

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

Para una versión de paquete específica, agregue un segmento de versión adicional a la URL:

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

Además, si está usando conda ( como lo sugiere @ShpielMeister ), puede usar:

conda info package==X.X.X

para mostrar información, incluidas las dependencias de una versión en particular o:

conda info package

para mostrar información, incluidas las dependencias sobre todas las versiones compatibles de ese paquete.

pgmank
fuente
1
Bajé la votación porque este punto final json no es confiable. Para ver un ejemplo boto3, require_dist es nulo pero ese es un proyecto que ciertamente tiene dependencias en los metadatos .
wim