2012-02-10 17 views
77

के साथ स्थापित पायथन पैकेज के लिए निर्भरता संबंधों की पहचान करना जब मैं एक पाइप फ्रीज करता हूं तो मुझे बड़ी संख्या में पायथन पैकेज दिखाई देते हैं जिन्हें मैंने स्पष्ट रूप से इंस्टॉल नहीं किया था, उदा।पाइप

$ pip freeze 
Cheetah==2.4.3 
GnuPGInterface==0.3.2 
Landscape-Client==11.01 
M2Crypto==0.20.1 
PAM==0.4.2 
PIL==1.1.7 
PyYAML==3.09 
Twisted-Core==10.2.0 
Twisted-Web==10.2.0 
(etc.) 

क्या यह निर्धारित करने का कोई तरीका है कि क्यों इन विशेष निर्भर पैकेजों को पाइप स्थापित किया गया? दूसरे शब्दों में, मैं अभिभावक पैकेज को कैसे निर्धारित करूं जिसमें इन पैकेजों को निर्भरता के रूप में रखा गया हो?

उदाहरण के लिए, मैं ट्विस्ट का उपयोग करना चाहूंगा और मैं पैकेज पर निर्भर नहीं रहना चाहता हूं जब तक कि मैं इसे गलती से अनइंस्टॉल करने या इसे अपग्रेड करने के बारे में अधिक नहीं जानता।

उत्तर

85

आप pipdeptree जो एक वृक्ष संरचना जैसे के रूप में निर्भरता को प्रदर्शित करता है की कोशिश कर सकते:

$ pipdeptree 
Lookupy==0.1 
wsgiref==0.1.2 
argparse==1.2.1 
psycopg2==2.5.2 
Flask-Script==0.6.6 
    - Flask [installed: 0.10.1] 
    - Werkzeug [required: >=0.7, installed: 0.9.4] 
    - Jinja2 [required: >=2.4, installed: 2.7.2] 
     - MarkupSafe [installed: 0.18] 
    - itsdangerous [required: >=0.21, installed: 0.23] 
alembic==0.6.2 
    - SQLAlchemy [required: >=0.7.3, installed: 0.9.1] 
    - Mako [installed: 0.9.1] 
    - MarkupSafe [required: >=0.9.2, installed: 0.18] 
ipython==2.0.0 
slugify==0.0.1 
redis==2.9.1 

इसे चलाने के लिए:

pip install pipdeptree 


संपादित करें: @ द्वारा नोट के रूप में टिप्पणियों में एस्टेबान आप पेड़ को इसके विपरीत में भी सूचीबद्ध कर सकते हैं -r या -p <package_name> के साथ एक एकल पैकेज तो क्या WERKZEUG स्थापित खोजने के लिए आप पड़ सकते है:

$ pipdeptree -r -p Werkzeug 
Werkzeug==0.11.15 
    - Flask==0.12 [requires: Werkzeug>=0.7] 
+4

मुझे लगता है कि आपको @mark के प्रश्न का पूरी तरह उत्तर देने की आवश्यकता है, आपको चलाने की आवश्यकता होगी: 'pipdeptree -r' " रिवर्स फैशन में निर्भरता पेड़ दिखाता है यानी उप-निर्भरता उन पैकेजों की सूची के साथ सूचीबद्ध होती है जिन्हें उनकी आवश्यकता होती है उनके तहत। " – Esteban

+0

इसी तरह की परियोजना: https://github.com/rbanffy/pip-chill –

+0

आप सभी पीपीपीआई पैकेजों के लिए रिवर्स ट्री को कैसे देख सकते हैं, न केवल स्थानीय रूप से स्थापित पैकेज? – Tijme

2

सबसे पहले pip freeze सभी वर्तमान में स्थापित पैकेज पाइथन प्रदर्शित करता है, जो आवश्यक रूप से पीआईपी का उपयोग नहीं करता है।

दूसरा पायथन पैकेज में निर्भर पैकेज के साथ-साथ required versions के बारे में जानकारी शामिल है। आप described here विधियों का उपयोग करके विशेष पीकेजी की निर्भरताओं को देख सकते हैं। जब आप पैकेज को अपग्रेड कर रहे हों तो पीआईपी जैसे इंस्टॉलर स्क्रिप्ट आपके लिए निर्भरताओं के अपग्रेड को संभालेगी।

पैकेजों को अद्यतन करने के लिए मैं PIP requirements files का उपयोग करने की सलाह देता हूं। आप परिभाषित कर सकते हैं कि आपको कौन से पैकेज और संस्करण की आवश्यकता है, और उन्हें पीपी इंस्टॉल का उपयोग करके एक बार इंस्टॉल करें।

57

pip show आदेश दिखाएगा क्या संकुल निर्दिष्ट पैकेज (ध्यान दें कि निर्दिष्ट पैकेज पहले से स्थापित किया जाना चाहिए) के लिए आवश्यक हैं:

$ pip show specloud 

Package: specloud 
Version: 0.4.4 
Requires: 
nose 
figleaf 
pinocchio 

pip show पिप संस्करण 1.4rc5

+1

'पिप show' संस्करण 1.4rc5 में पेश किया गया था, और (लेखन के रूप में वर्तमान) में मौजूद है 1.4.1 – drevicko

+8

यह ठीक मेरे सवाल का जवाब नहीं है, क्योंकि यह माता-पिता की बजाय एक विशिष्ट पैकेज के लिए बच्चों (निर्भरताओं) को दिखाता है। लेकिन इस आदेश का उपयोग करके प्रत्येक पैकेज की निर्भरताओं की जांच करने के लिए कुछ एक साथ फेंकना काफी आसान है। इसलिए, उदाहरण के लिए, मैं निर्धारित कर सकता हूं कि किस स्थापित पैकेज को PyYAML की आवश्यकता है। –

+4

मेरी पिछली टिप्पणी के अनुसार, यह शेल कमांड मेरे प्रत्येक स्थापित संकुल के लिए सभी निर्भरताओं को डंप करता है: $ पाइप फ्रीज | grep -v "\ -e" | sed s /\=\=.*// | अजीब 'प्रणाली ("पीआईपी शो" $ 1)' –

13

में पेश किया गया था मैं के रूप में हाल ही में hn thread पर कहा गया है, मैं निम्नलिखित की सिफारिश करूंगा:

अपनी मुख्य निर्भरताओं के साथ requirements.txt फ़ाइल पर टिप्पणी की है:

## this is needed for whatever reason 
package1 

अपनी निर्भरताओं को स्थापित करें: pip install -r requirements.txt। अब आप pip freeze -r requirements.txt के साथ अपने निर्भरता की पूरी सूची प्राप्त:

## this is needed for whatever reason 
package1==1.2.3 

## The following requirements were added by pip --freeze: 
package1-dependency1==1.2.3 
package1-dependency1==1.2.3 

यह आपको टिप्पणी के साथ अपनी फ़ाइल संरचना रखने के लिए अनुमति देता है, अच्छी तरह से अपने निर्भरता की निर्भरता से अपने को अलग करने निर्भरता। इस तरह से आप दिन आप :)

नोट उनमें से एक को हटाने के लिए निम्नलिखित की जरूरत है एक बहुत अच्छे समय होगा:

  • आपको अपना पूरा requirements.txt के पुनर्निर्माण के लिए संस्करण नियंत्रण के साथ एक साफ requirements.raw हो सकता है।
  • प्रक्रिया में अंडा नामों द्वारा प्रतिस्थापित गिट यूआरएल से सावधान रहें।
  • आपकी निर्भरताओं की निर्भरताएं अभी भी वर्णानुक्रम से क्रमबद्ध हैं, इसलिए आप सीधे नहीं जानते कि किस पैकेज द्वारा आवश्यक था लेकिन इस बिंदु पर आपको वास्तव में इसकी आवश्यकता नहीं है।
  • विशिष्ट आवश्यकताओं को सूचीबद्ध करने के लिए pip install --no-install <package_name> का उपयोग करें।
  • यदि आप नहीं करते हैं तो virtualenv का उपयोग करें।
+0

मुझे समझ में नहीं आता कि यह 'पीआईपी फ्रीज -आर आवश्यकताओं.txt'' का व्यापक रूप से उपयोग क्यों नहीं किया जाता है। निर्भरताओं और उप निर्भरताओं को बनाए रखने के लिए बहुत उपयोगी है। –

5

आप एक लाइन कमांड का भी उपयोग कर सकते हैं जो पीपी शो के लिए पैकेजों को पाइप करता है।

cut -d'=' -f1 requirements.txt | xargs pip show 
+1

आम तौर पर आप require.txt के प्रारूप के रूप में नहीं कर सकते हैं ' == ' से अधिक जटिल है। –

0

(वैकल्पिक हल, नहीं सही जवाब)

, एक ही समस्या थी lxml स्थापित करने नहीं है और मुझे पता है, जो lxml जरूरत चाहने के साथ। नहीं जो lxml को की आवश्यकता है। इस मुद्दे को छोड़कर समाप्त हो गया।

  1. यह नोट करते हुए कि मेरी साइट पैकेज कहां रखा जा रहा था।

  2. वहां जाएं और आयात के लिए जीआरपी रिकर्सिव करें (अंतिम grep का - इनवर्टर-मैच एलएक्सएमएल की अपनी फाइलों को विचार से हटाने के लिए कार्य करता है)।

हाँ, कैसे पिप उपयोग करने के लिए यह करने के लिए है, लेकिन मैं सुझाव यहाँ से बाहर किसी भी सफलता, किसी भी कारण नहीं मिला है के रूप में एक जवाब नहीं।

site-packages me$ egrep -i --include=*.py -r -n lxml . | grep import | grep --invert-match /lxml/ 
1

मैं इस समस्या को हल करने के लिए एक त्वरित पटकथा लिखी। निम्न स्क्रिप्ट किसी भी दिए गए पैकेज के लिए अभिभावक (आश्रित) पैकेज प्रदर्शित करेगी। इस तरह आप सुनिश्चित कर सकते हैं कि किसी विशेष पैकेज को अपग्रेड या इंस्टॉल करना सुरक्षित है। यह इस प्रकार है के रूप में इस्तेमाल किया जा सकता: dependants.py PACKAGENAME

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

"""Find dependants of a Python package""" 

import logging 
import pip 
import pkg_resources 
import sys 

__program__ = 'dependants.py' 


def get_dependants(target_name): 
    for package in pip.get_installed_distributions(): 
     for requirement_package in package.requires(): 
      requirement_name = requirement_package.project_name 
      if requirement_name == target_name: 
       package_name = package.project_name 
       yield package_name 


# configure logging 
logging.basicConfig(format='%(levelname)s: %(message)s', 
        level=logging.INFO) 

try: 
    target_name = sys.argv[1] 
except IndexError: 
    logging.error("missing package name") 
    sys.exit(1) 

try: 
    pkg_resources.get_distribution(target_name) 
except pkg_resources.DistributionNotFound: 
    logging.error("'%s' is not a valid package", target_name) 
    sys.exit(1) 

print(list(get_dependants(target_name)))