repositorio - Árbol de dependencias del paquete Python
upload to pypi (3)
Me gustaría analizar el árbol de dependencia de los paquetes de Python. ¿Cómo puedo obtener estos datos?
Cosas que ya se
-
setup.py
veces contiene un campo derequires
que enumera dependencias de paquetes - PyPi es un repositorio en línea de paquetes Python
- PyPi tiene una API
Cosas que no se
- Muy pocos proyectos (alrededor del 10%) en PyPi enumeran explícitamente las dependencias en el campo de
requires
, peropip/easy_install
aún pueden descargar los paquetes correctos. ¿Qué me estoy perdiendo? Por ejemplo, la popular biblioteca para la computación estadística,pandas
, no enumerarequires
pero aún así se las arregla para instalarnumpy
,pytz
, etc. - ¿Hay una base de datos preexistente en algún lugar? ¿Estoy repitiendo el trabajo existente?
- ¿Existen bases de datos similares y de fácil acceso para otros idiomas con sistemas de distribución (R, Clojure, etc.)?
Aquí es cómo puede hacerlo mediante programación usando el paquete python pip
:
from pip._vendor import pkg_resources # Ensure pip conf index-url pointed to real PyPi Index
# Get dependencies from pip
package_name = ''Django''
try:
package_resources = pkg_resources.working_set.by_key[package_name.lower()] # Throws KeyError if not found
dependencies = package_resources._dep_map.keys() + ([str(r) for r in package_resources.requires()])
dependencies = list(set(dependencies))
except KeyError:
dependencies = []
Y aquí es cómo puede obtener dependencias de la API de PyPi:
import requests
import json
package_name = ''Django''
# Package info url
PYPI_API_URL = ''https://pypi.python.org/pypi/{package_name}/json''
package_details_url = PYPI_API_URL.format(package_name=package_name)
response = requests.get(package_details_url)
data = json.loads(response.content)
if response.status_code == 200:
dependencies = data[''info''].get(''requires_dist'')
dependencies2 = data[''info''].get(''requires'')
dependencies3 = data[''info''].get(''setup_requires'')
dependencies4 = data[''info''].get(''test_requires'')
dependencies5 = data[''info''].get(''install_requires'')
if dependencies2:
dependencies.extend(dependencies2)
if dependencies3:
dependencies.extend(dependencies3)
if dependencies4:
dependencies.extend(dependencies4)
if dependencies5:
dependencies.extend(dependencies5)
dependencies = list(set(dependencies))
Puede usar la recursividad para llamar a dependencias de dependencias para obtener el árbol completo. ¡Aclamaciones!
Debería estar mirando el campo install_requires
lugar , vea setup
clave de setup
nuevas y modificadas .
requires
se considere un campo demasiado vago para confiar en la instalación de dependencias. Además, hay campos setup_requires
y test_requires
para las dependencias necesarias para setup.py
y para ejecutar pruebas.
Ciertamente, el gráfico de dependencia ha sido analizado anteriormente; de este artículo de blog de Olivier Girardot viene esta fantástica imagen:
La imagen está vinculada a la versión interactiva del gráfico.