warehouse repositorio python dependency-management pypi

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

  1. setup.py veces contiene un campo de requires que enumera dependencias de paquetes
  2. PyPi es un repositorio en línea de paquetes Python
  3. PyPi tiene una API

Cosas que no se

  1. Muy pocos proyectos (alrededor del 10%) en PyPi enumeran explícitamente las dependencias en el campo de requires , pero pip/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 enumera requires pero aún así se las arregla para instalar numpy , pytz , etc.
  2. ¿Hay una base de datos preexistente en algún lugar? ¿Estoy repitiendo el trabajo existente?
  3. ¿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.


Usando una herramienta como pip , puede enumerar todos los requisitos para cada paquete.

El comando es:

pip install --no-install package_name

Puedes reutilizar parte de pip en tu script. La parte responsable de los requisitos de análisis es el módulo pip.req .