Python package dependency tree

Chciałbym przeanalizować drzewo zależności pakietów Pythona. Jak Mogę uzyskać te dane?

Things I already know

  1. setup.py czasami zawiera pole requires, które wyświetla zależności pakietu
  2. PyPi jest internetowym repozytorium pakietów Pythona.]}
  3. PyPi ma API

Things that I don ' t know

  1. bardzo niewiele projektów (około 10%) na PyPi wyraźnie wyświetla zależności w polu requires, ale pip/easy_install wciąż udaje się pobrać właściwe Pakiety. Co przegapiłem? Na przykład popularna biblioteka do obliczeń statystycznych, pandas, nie wyświetla listy requires, ale nadal udaje się zainstalować numpy, pytz, itd.... Czy istnieje lepszy sposób automatycznego zbierania pełnej listy zależności?
  2. czy istnieje gdzieś wcześniej istniejąca baza danych? Czy powtarzam istniejącą pracę?
  3. Czy podobne, łatwo dostępne, bazy danych istnieją dla innych języków z systemami dystrybucji (R, Clojure, itp...?)
Author: MRocklin, 2013-03-29

3 answers

Powinieneś spojrzeć na pole install_requires zamiast, Zobacz nowe i zmienione setup Słowa kluczowe .

requires jest uważane za zbyt niejasne pole, aby polegać na instalacji zależności. Ponadto istnieją pola setup_requires i test_requires Dla zależności wymaganych dla setup.py i dla uruchamiania testów.

Oczywiście, wykres zależności był analizowany już wcześniej; z tego artykułu na blogu Oliviera Girardota pochodzi ten fantastyczny obraz:

Zależności PyPI
Na obraz jest połączony z interaktywną wersją wykresu.

 18
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:40:23

Używając narzędzia takiego jak pip , możesz wyświetlić listę wszystkich wymagań dla każdego pakietu.

Komenda brzmi:

pip install --no-install package_name

Możesz ponownie użyć części pip w swoim skrypcie. Częścią odpowiedzialną za parsowanie wymagań jest moduł pip.req.

 2
Author: vartec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-05 06:36:30

Oto jak możesz to zrobić programowo używając Pythona pip Pakiet:

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 = []

A oto jak można uzyskać zależności z API 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))

Możesz użyć rekurencji do wywołania zależności zależności, aby uzyskać pełne drzewo. Zdrowie!

 0
Author: radtek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-27 03:14:58