2013-03-29 18 views
21

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

Co już wiem

  1. setup.py czasami zawiera requires pole z listą zależności pakietów
  2. PyPI to repozytorium online pakietów Pythona
  3. PyPI ma API

Rzeczy, które Nie wiem:

  1. Bardzo niewiele projektów (około 10%) w PyPi jawnie wymienia zależności w polu requires, ale nadal pobiera prawidłowe pakiety. czego mi brakuje? Na przykład popularna biblioteka do obliczeń statystycznych, pandas, nie wymienia requires, ale nadal udaje się zainstalować numpy, pytz, itp .... Czy istnieje lepszy sposób na automatyczne zbieranie pełnej listy zależności?
  2. Czy istnieje gdzieś istniejąca baza danych? Czy powtarzam istniejącą pracę?
  3. Czy podobna, łatwo dostępny, bazy danych istnieje dla innych języków z systemów dystrybucyjnych (r, Clojure, etc ...?)
+0

Twoje pytanie w obecnej formie jest w rzeczywistości zbyt szerokie. Nie umieszczaj zbyt wielu pytań w poście i nie pozwól, aby był on praktyczny i odpowiedzialny. Twój punkt 3. Zaprasza debatę i listy zakupów, a nie konkretne odpowiedzi. –

Odpowiedz

18

Należy patrzeć na polu install_requires zamiast patrz New and changed setup keywords.

requires Uznano za mało precyzyjne pole, na którym można polegać podczas instalacji zależności. Ponadto istnieją pola setup_requires i test_requires dla zależności wymaganych dla setup.py i do uruchamiania testów.

Z pewnością wykres zależności został przeanalizowany wcześniej; z tego blog article by Olivier Girardot przychodzi ten wspaniały obraz:

PyPI dependencies
Obraz jest związana z interaktywnej wersji wykresu.

+1

thx za komplement: p –

+4

Cóż, to * jest * bardzo piękny wykres! –

+1

Ten wykres jest niesamowity. – Will

2

Za pomocą narzędzia takiego jak pip można wyświetlić listę wszystkich wymagań dla każdego pakietu.

Polecenie brzmi:

pip install --no-install package_name 

można ponownie wykorzystać część pip w skrypcie. Częścią odpowiedzialną za wymagania parsowania jest moduł pip.req.

+2

Podoba mi się pomysł użycia 'pip' z poziomu Pythona. Interfejs wiersza poleceń zakończy się niepowodzeniem, jeśli już mam zainstalowany pakiet. W jaki sposób mogę użyć kodu Pythona bezpośrednio w celu znalezienia zależności konkretnego pakietu? – MRocklin

+1

'--no-install' jest przestarzałe. –

0

Oto w jaki sposób można to zrobić programowo przy użyciu Python 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 w jaki sposób można uzyskać zależności od 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żna użyć rekursji zadzwonić zależności zależności, aby uzyskać pełne drzewo. Twoje zdrowie!

Powiązane problemy