पायथन पैकेज की निर्भरता कैसे खोजें


106

आप प्रोग्रामर को निर्भरता के पायथन पैकेज की सूची कैसे दे सकते हैं?

मानक setup.pyमें ये दस्तावेज हैं, लेकिन मैं इसे पायथन या कमांड लाइन से एक्सेस करने का आसान तरीका नहीं खोज सकता ।

आदर्श रूप से, मैं कुछ इस तरह की तलाश में हूँ:

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

या:

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

ध्यान दें, मैं एक पैकेज को आयात करने और सभी संदर्भित मॉड्यूल खोजने के बारे में बात नहीं कर रहा हूं। हालांकि यह अधिकांश आश्रित पैकेजों को ढूँढ सकता है, यह आवश्यक न्यूनतम संस्करण संख्या खोजने में सक्षम नहीं होगा। यह केवल setup.py में संग्रहीत है।


काफी कुछ जवाब यहाँ कार्यक्रमों में उपयोग के लिए आयात किया जा रहा पाइप दिखाते हैं। पिप के लिए दस्तावेज़ दृढ़ता से पिप के इस प्रयोग के विरूद्ध सलाह देता है। किसी भी महत्वपूर्ण चीज के लिए इन समाधानों का उपयोग करने के लिए ध्यान में रखना चाहिए।
जॉर्डन मैकी

जवाबों:


97

pip show [package name]कमांड के अलावा , वहाँ है pipdeptree

बस करो

$ pip install pipdeptree

फिर भागो

$ pipdeptree

और यह आपको एक पेड़ के रूप में अपनी निर्भरता दिखाएगा, जैसे,

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]

यह परियोजना https://github.com/naiquevin/pipdeptree पर स्थित है , जहाँ आपको उपयोग की जानकारी भी मिलेगी।


7
pipdeptreeकेवल दिए गए पैकेज के ही नहीं, सभी स्थापित पैकेजों की निर्भरता दिखाएं । जब आप इसके --jsonआउटपुट को फ़िल्टर कर सकते हैं , यह अभी भी पहले से इंस्टॉल किए जाने वाले पैकेज पर निर्भर करता है।
sschuberth

सच है, लेकिन उत्तर तब भी उपयोगी है जब आप एक पकड़ प्राप्त करना चाहते हैं कि पैकेज क्यों स्थापित किए गए थे जो आपके requirements.txt:) में नहीं हैं
बेरिक

3
इसके अलावा आप केवल कुछ पैकेजों का चयन करने के लिए -pविकल्प का उपयोग कर सकते हैं जिनकी निर्भरता आप तलाशना चाहते हैं।
ज़ाचरी रामजी

2
pipdeptreeअनुकूलन के समय सुपर सहायक था requirements.txt$ pipdeptree | grep -P '^\w+' यह केवल शीर्ष स्तर के पैकेजों का उत्पादन करता है। अधिक जानकारी यहाँ
लीड डेवलपर

64

उदाहरण के लिए, showकमांड का उपयोग करने का प्रयास करें pip:

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

अद्यतन (निर्दिष्ट संस्करण के साथ deps पुनर्प्राप्त करें):

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
यह आपको पैकेज का संस्करण बताता है , न कि इसकी निर्भरता ; वे सिर्फ सूचीबद्ध हैं।
jonrsharpe

Requiresखंड देखें
एलेक्स लिसोवॉय

3
हां, लेकिन यह "न्यूनतम संस्करण संख्या आवश्यक" नहीं दिखाता है , जैसा कि ओपी की आवश्यकता है:
जॉन्सर्शपे

1
किसी तरह मेरे लिए $ pip3 show beautifulsoup4खाली दिखाता है Requires: - क्या beautifulsoup4 कुछ पर निर्भर नहीं करता है?
xealits

4
@PythJJin, हां, जाहिर है कि यह केवल मानक पैकेज का उपयोग करता है .. मैं बस इसके साथ थोड़ा आश्चर्यचकित था। शाबाश, beautifulsoup4
xealits

6

काफी कुछ जवाब यहाँ कार्यक्रमों में उपयोग के लिए आयात किया जा रहा पाइप दिखाते हैं। पिप के लिए दस्तावेज़ दृढ़ता से पिप के इस प्रयोग के विरूद्ध सलाह देता है

pkg_resourcesपाइप आयात के माध्यम से पहुंचने के बजाय , आप वास्तव में pkg_resourcesसीधे आयात कर सकते हैं और उसी तर्क का उपयोग कर सकते हैं (जो वास्तव में पैकेज मेटा सूचनाओं को प्रोग्रामेटिक रूप से देखने के इच्छुक लोगों के लिए लिंक किए गए पाइप डॉक्स में सुझाए गए समाधानों में से एक है)।

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

यदि आपको यह पता लगाने में थोड़ी परेशानी हो रही है कि आपके पैकेज का नाम क्या है, तो यह WorkingSetउदाहरण pkg_resources.working_setलागू किया गया है __iter__ताकि आप उन सभी को प्रिंट कर सकें और उम्मीद है कि आप वहां हाजिर हों :)

अर्थात

import pkg_resources

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

यह अजगर 2 और 3 दोनों के साथ काम करता है (हालांकि आपको python2 के लिए प्रिंट स्टेटमेंट को समायोजित करने की आवश्यकता होगी)


3

(यह एक कानूनी व्याख्याकार है और आधुनिक पीप वर्जन के लिए उपलब्ध होना चाहिए और पुराने पीप वर्जन के संदर्भ के लिए यहां छोड़ दिया गया है) एलेक्स का जवाब अच्छा है (+1)। अजगर में:

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

कुछ इस तरह लौटना चाहिए

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

जहां मुड़ पैकेज का नाम है, जिसे आप शब्दकोश में पा सकते हैं:

pip._vendor.pkg_resources.WorkingSet().entry_keys

उन सभी को सूचीबद्ध करने के लिए:

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

आपको इस तरह की सूची देनी चाहिए:

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

क्या हाल के संस्करणों में कुछ बदल गया है? यह _vendorविशेषता पाइप संस्करण में मौजूद नहीं है 19.1.1(संपादित करें: ठीक है, यह pkg_resourcesनवीनतम पायथन संस्करण में पैकेज में स्थानांतरित हो गया है !)
प्रहलाद यारी

हां, चीजें बदल गई हैं, और मैं या तो इसे अपडेट करने या नीचे की सिफारिश के पक्ष में इसे हटाने जा रहा हूं।
cgseller

एलेक्स का जवाब केवल मेरे दृष्टिकोण से आंशिक रूप से बेहतर है (अच्छी तरह से pip showहिस्सा अच्छा है, बाकी नहीं)। या तो उपयोग pip show, pipdeptree या जॉर्डन मैकी के जवाब का उपयोग करके देख setuptools ' pkg_resourcesसीधे।
सिनोरोक

2

Https://lbooks.io/ का उपयोग करें । यह पाइप का उपयोग करने से पहले निर्भरता का पता लगाने के लिए एक अच्छी जगह है।

उदाहरण के लिए। Google-क्लाउड-स्टोरेज टाइप करें और खोज करें, फिर आप लाइब्रेरी ( https://lbooks.io/rubygems/google-cloud-storage ) के लिए पेज पा सकते हैं । उस संस्करण का चयन करें जिसके लिए आप 'रिलीव्स ’(निर्भरता नवीनतम है) से निर्भरता का पता लगाना चाहते हैं, Dep निर्भरता’ के तहत आप निर्भरता सूची और उनके समर्थित संस्करणों को पा सकते हैं।


1

अजगर में इस लेख के अनुसार कोशिश करें :

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)

यह इस तरह दिखाई देगा:

['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']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.