Python package dependency tree
Chciałbym przeanalizować drzewo zależności pakietów Pythona. Jak Mogę uzyskać te dane?
Things I already know
-
setup.py
czasami zawiera polerequires
, które wyświetla zależności pakietu
PyPi jest internetowym repozytorium pakietów Pythona.]}
- PyPi ma API
Things that I don ' t know
- bardzo niewiele projektów (około 10%) na PyPi wyraźnie wyświetla zależności w polu
requires
, alepip/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 listyrequires
, ale nadal udaje się zainstalowaćnumpy
,pytz
, itd.... Czy istnieje lepszy sposób automatycznego zbierania pełnej listy zależności? - czy istnieje gdzieś wcześniej istniejąca baza danych? Czy powtarzam istniejącą pracę?
- Czy podobne, łatwo dostępne, bazy danych istnieją dla innych języków z systemami dystrybucji (R, Clojure, itp...?)
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:
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
.
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!
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