Bir Python paketinin bağımlılıkları nasıl bulunur


109

Bir Python paketinin bağımlılıklar listesini programlı olarak nasıl elde edebilirsiniz?

Standart setup.pybu belgelemiştir, ancak bunu erişmek için kolay bir yol bulamıyorum gelen ya Python veya komut satırından.

İdeal olarak, şöyle bir şey arıyorum:

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

veya:

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

Not, bir paketi içe aktarmaktan ve başvurulan tüm modülleri bulmaktan bahsetmiyorum. Bu, bağımlı paketlerin çoğunu bulabilirken, gereken minimum sürüm numarasını bulamayacaktır. Bu yalnızca setup.py'de saklanır.


Buradaki pek çok cevap, pip'in programlarda kullanılmak üzere içe aktarıldığını gösteriyor. Pip belgeleri kuvvetle pip bu kullanım karşı tavsiyede. Bu çözümlerden herhangi birinin önemli bir şey için kullanılması durumunda akılda tutulması gereken bir şey.
Jordan Mackie

Yanıtlar:


102

pip show [package name]Komuta ek olarak var pipdeptree.

Sadece yap

$ pip install pipdeptree

o zaman koş

$ pipdeptree

ve size bağımlılıklarınızı bir ağaç biçiminde gösterecektir, örneğin,

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]

Proje, kullanım bilgilerini de bulacağınız https://github.com/naiquevin/pipdeptree adresinde bulunmaktadır .


8
pipdeptreeyalnızca belirli bir paketin bağımlılıklarını değil, kurulu tüm paketlerin bağımlılıklarını gösterin . Çıktısını filtreleyebilseniz de , zaten kurulacak paketlere bağlıdır. --json
sschuberth

Doğru, ancak sizin requirements.txt
yerinizde

3
Ayrıca , bağımlılıklarını keşfetmek istediğiniz yalnızca birkaç paketi seçme -pseçeneğini kullanabilirsiniz .
Zaccharie Remzi

2
pipdeptreeoptimize ederken çok yardımcı oldu requirements.txt. $ pipdeptree | grep -P '^\w+' Bu, yalnızca üst düzey paketleri çıkarır. Daha fazla bilgi burada
Lider Geliştirici

67

Örneğin, showkomut kullanmayı deneyin pip:

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

Güncelleme (belirtilen sürüme sahip depoları alın):

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']

2
Bu size paketin bağımlılıklarını değil sürümünü söyler ; sadece listelenirler.
jonrsharpe

Bkz. RequiresBölüm
Alex Lisovoy

3
Evet, ancak OP'nin gerektirdiği için "gerekli minimum sürüm numarasını" göstermiyor :
jonrsharpe

1
Bir şekilde benim için $ pip3 show beautifulsoup4boş görünüyor Requires: - güzelsoup4 hiçbir şeye bağlı değil mi?
xealits

4
@PythonJin, evet, görünüşe göre sadece standart paketleri kullanıyor .. Buna biraz şaşırdım. Aferin beautifulsoup4,.
2016

6

Buradaki pek çok cevap, pip'in programlarda kullanılmak üzere içe aktarıldığını gösteriyor. Pip belgeleri kuvvetle pip bu kullanım karşı tavsiyede .

pkg_resourcesPip içe aktarma yoluyla erişmek yerine, aslında pkg_resourcesdoğrudan içe aktarabilir ve aynı mantığı kullanabilirsiniz (aslında bu, paket meta bilgilerini programlı olarak görmek isteyen herkes için bağlantılı olan pip belgelerinde önerilen çözümlerden biridir).

import pkg_resources

_package_name = 'yourpackagename'

def get_dependencies_with_semver_string():
    package = pkg_resources.working_set.by_key[_package_name]
    return [str(r) for r in package.requires()]

Paket adınızın tam olarak ne olduğunu bulmakta biraz sorun yaşıyorsanız, uygulamalar WorkingSettarafından döndürülen örnek , böylece hepsini yazdırabilir ve umarım sizinkini orada bulabilirsiniz :)pkg_resources.working_set__iter__

yani

import pkg_resources

def print_all_in_working_set():
    ws = pkg_resources.working_set
    for package_name in ws:
        print(ws)

Bu hem python 2 hem de 3 ile çalışır (ancak python2 için yazdırma ifadelerini ayarlamanız gerekir)


4

(BU YASAL BİR CEVAPTIR VE MODERN PIP VERSİYONLARI İÇİN ÖNLENMELİDİR VE ESKİ PIP VERSİYONLARINA BAŞVURMAK İÇİN BURAYA BIRAKILMALIDIR) Alex'in cevabı iyidir (+1). Python'da:

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

gibi bir şey döndürmeli

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

sözlükte bulabileceğiniz paketin adı bükülmüş:

pip._vendor.pkg_resources.WorkingSet().entry_keys

hepsini listelemek için:

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))

size böyle listeler vermeli:

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')]

Son sürümlerde bir şey değişti mi? _vendorNitelik pip sürümünde mevcut görünmüyor 19.1.1(Düzenleme: Tamam, taşınmış gibi görünüyor pkg_resourcesson piton sürümünde paket!)
Prahlad Yeri

Evet, işler değişti ve aşağıdaki öneri lehine bunu güncellemeye veya kaldırmaya bakacağım.
cgseller

Alex'in cevabı benim açımdan sadece kısmen daha iyi (pekala, pip showkısmı iyidir, geri kalanı değil). Ya kullanımı pip show, pipdeptree veya Ürdün Mackie cevabı kullanarak bkz Setuptools'u ' pkg_resourcesdoğrudan.
sinoroc

2

Https://libraries.io/ adresini kullanın . Pip kullanarak kurmadan önce bağımlılıkları keşfetmek için iyi bir yerdir.

Örneğin. Google-cloud-storage yazın ve arayın, ardından kitaplık sayfasını bulabilirsiniz ( https://libraries.io/rubygems/google-cloud-storage ). Bağımlılıklarını keşfetmek istediğiniz sürümü 'Sürümler'den (varsayılan en son sürüm) seçin,' Bağımlılıklar 'altında bağımlılık listesini ve desteklenen sürümlerini bulabilirsiniz.


1

Bunu python'daki bu makaleye göre deneyin :

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)

Şöyle görünecek:

['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']
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.