python - पाइप के साथ स्थापित पायथन पैकेज के लिए निर्भरता संबंध की पहचान




pip (5)

आप pipdeptree को आजमा 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


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

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

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

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

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

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


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

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

मैंने इस समस्या को हल करने के लिए एक त्वरित लिपि लिखी है। निम्न स्क्रिप्ट किसी भी दिए गए पैकेज के लिए अभिभावक (आश्रित) पैकेज प्रदर्शित करेगी। इस तरह आप सुनिश्चित कर सकते हैं कि किसी विशेष पैकेज को अपग्रेड या इंस्टॉल करना सुरक्षित है। इसका उपयोग निम्नानुसार किया जा सकता है: 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)))

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

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

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


(कामकाज, सही जवाब नहीं)

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

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

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

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

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






pip