2015-04-20 26 views
26

Jak programowo uzyskać listę zależności pakietu Pythona?Jak znaleźć zależności od pakietu Pythona

Standardowa setup.py ma to udokumentowane, ale nie mogę znaleźć w łatwy sposób uzyskać do niego dostęp z albo Python lub wiersza poleceń.

Idealnie szukam czegoś podobnego:

$ pip install somepackage --only-list-deps 
kombu>=3.0.8 
billiard>=3.3.0.13 
boto>=2.26 

lub:

>>> import package_deps 
>>> package = package_deps.find('somepackage') 
>>> print package.dependencies 
['kombu>=3.0.8', 'billiard>=3.3.0.13', 'boto>=2.26'] 

Uwaga, nie mówię o importowaniu pakietu i znalezienie wszystkie odwołuje modułów. Chociaż może znaleźć większość zależnych pakietów, nie będzie w stanie znaleźć wymaganego minimalnego numeru wersji. Jest to przechowywane tylko w pliku setup.py.

Odpowiedz

26

spróbuj użyć polecenia show w pip, na przykład:

$ pip show tornado 
--- 
Name: tornado 
Version: 4.1 
Location: ***** 
Requires: certifi, backports.ssl-match-hostname 

Aktualizacja (pobieranie deps z określonej wersji):

from pip._vendor import pkg_resources 


_package_name = 'somepackage' 
_package = pkg_resources.working_set.by_key[_package_name] 

print([str(r) for r in _package.requires()]) # retrieve deps from setup.py 

Output: ['kombu>=3.0.8', 
     'billiard>=3.3.0.13', 
     'boto>=2.26'] 
+1

który mówi wersję pakietu * *, a nie jego * Zależności *; po prostu pojawiają się na liście. – jonrsharpe

+0

Patrz sekcja "Wymagane" sekcja –

+3

Tak, ale nie pokazuje * "wymaganego minimalnego numeru wersji" *, ponieważ PO wymaga: – jonrsharpe

3

odpowiedź Alex jest dobry (+1). W Pythonie:

pip._vendor.pkg_resources.working_set.by_key['twisted'].requires() 

powinien powrócić coś jak

[Requirement.parse('zope.interface>=3.6.0')] 

gdzie skręcona jest nazwą pakietu, które można znaleźć w słowniku:

pip._vendor.pkg_resources.WorkingSet().entry_keys 

je wszystkie listy:

dict = pip._vendor.pkg_resources.WorkingSet().entry_keys 
for key in dict: 
    for name in dict[key]: 
     req =pip._vendor.pkg_resources.working_set.by_key[name].requires() 
     print('pkg {} from {} requires {}'.format(name, 
                key, 
                req)) 

sh Ould daje list tak:

pkg pyobjc-framework-syncservices from /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC requires [Requirement.parse('pyobjc-core>=2.5.1'), Requirement.parse('pyobjc-framework-Cocoa>=2.5.1'), Requirement.parse('pyobjc-framework-CoreData>=2.5.1')] 
24

Oprócz komendy pip show [package name] istnieje pipdeptree.

Wystarczy zrobić

$ pip install pipdeptree 

następnie uruchomić

$ pipdeptree 

i pokaże swoje zależności w formie drzewa, np

flake8==2.5.0 
    - mccabe [required: >=0.2.1,<0.4, installed: 0.3.1] 
    - pep8 [required: !=1.6.0,>=1.5.7,!=1.6.1,!=1.6.2, installed: 1.5.7] 
    - pyflakes [required: >=0.8.1,<1.1, installed: 1.0.0] 
ipdb==0.8 
    - ipython [required: >=0.10, installed: 1.1.0] 

Projekt zlokalizowany jest na https://github.com/naiquevin/pipdeptree, gdzie znajdziesz również informacje o użytkowaniu.

+1

'pipdeptree' pokazuje zależności * wszystkich * * zainstalowanych * pakietów, nie tylko tych z danego pakietu. Chociaż możesz filtrować jego wyjście '--json', nadal zależy to od tego, które pakiety są już zainstalowane. – sschuberth

+0

To prawda, ale odpowiedź jest nadal przydatna, gdy chcesz dowiedzieć się, dlaczego pakiety zostały zainstalowane, które nie są w twoim 'requirements.txt' :) – beruic

1

Spróbuj to zgodnie z tym article w python:

import pip 
installed_packages = pip.get_installed_distributions() 
installed_packages_list = sorted(["%s==%s" % (i.key, i.version) 
    for i in installed_packages]) 
print(installed_packages_list) 

To pokaże jak:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0', 
'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
'werkzeug==0.9.4'] 
+1

Dobra próba, zadziałało to dla mnie. Dzięki –

Powiązane problemy