পাইপের সাথে ইনস্টল করা পাইথন প্যাকেজগুলির জন্য নির্ভরতার সম্পর্ক চিহ্নিত করা


151

আমি যখন পাইপ ফ্রিজ করি তখন আমি প্রচুর পাইথন প্যাকেজ দেখতে পাই যা আমি স্পষ্টভাবে ইনস্টল করি নি, যেমন

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

এই নির্দিষ্ট নির্ভরযোগ্য প্যাকেজগুলি কেন পাইপ ইনস্টল করেছে তা নির্ধারণ করার জন্য আমার জন্য কি কোনও উপায় আছে? অন্য কথায়, আমি প্যারেন্ট প্যাকেজকে কীভাবে নির্ধারণ করব যা এই প্যাকেজগুলিকে নির্ভরতা হিসাবে করেছিল?

উদাহরণস্বরূপ, আমি ট্যুইস্টেড ব্যবহার করতে চাই এবং আমি কোনও প্যাকেজের উপর নির্ভর করতে চাই না যতক্ষণ না আমি দুর্ঘটনাক্রমে এটি আনইনস্টল না করা এবং এটি আপগ্রেড না করা সম্পর্কে আরও জানতে না চাই।

উত্তর:


180

আপনি পিপডপ্রি চেষ্টা করতে পারেন যা গাছের কাঠামোর হিসাবে নির্ভরতা প্রদর্শন করে:

$ 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>:

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

6
আপনার কাছে চালানো দরকার এমন @ মার্কের প্রশ্নের পুরো উত্তর দিতে আমি বিশ্বাস করি: pipdeptree -r "বিপরীত ফ্যাশনে নির্ভরতা গাছ দেখায় অর্থাত্। উপ-নির্ভরতাগুলি তাদের অধীনে থাকা প্যাকেজের তালিকার সাথে তালিকাভুক্ত রয়েছে।"
এস্তেবান

স্থানীয়ভাবে ইনস্টল করা প্যাকেজগুলিই নয়, আপনি সমস্ত পিপিআই প্যাকেজগুলির জন্য বিপরীত গাছটি কীভাবে দেখতে পারবেন?
তিজমে

2
pipdeptreeমহান. দুর্ভাগ্যবশত এটি দ্বারা ইনস্টল থাকা প্যাকেজগুলি অ্যাকাউন্ট নির্ভরতা নিতে বলে মনে হচ্ছে না conda: যেমন একটি conda env যেখানে matplotlibএবং numpyপিপ ব্যবহার করে ইনস্টল করা হয়েছে, কিন্তু scipy, conda ব্যবহার ইনস্টল করা ছিল scipyআপ pipdeptree কোন depencies এবং কোন নির্ভরশীলদের (এছাড়াও তার হিসাবে শো pip show scipyশো কোন প্রয়োজনীয়তা)।
ডিজেভিজি

@ ডেনিস আমি এটি চেষ্টা করি নি তবে এটি কনডা github.com/rvalieris/conda-tree
djsutho

1
ভার্চুয়াল পরিবেশে এটি ব্যবহার করতে, আপনাকে python -m pipdeptreeঅন্যথায় করতে হবে (এক্সিকিউটেবলটি ভার্চুয়ালেনভের সাথে ইনস্টল থাকা অবস্থায়ও) এটি কেবলমাত্র সিস্টেমের নির্ভরতা তালিকাভুক্ত করে।
জিম

81

pip showকমান্ড দেখাবে কি প্যাকেজ নির্দিষ্ট প্যাকেজ (দয়া করে মনে রাখবেন নির্ধারিত প্যাকেজের ইতিমধ্যে ইনস্টল করা আবশ্যক) জন্য প্রয়োজন হয়:

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

pip show পাইপ সংস্করণ 1.4rc5 এ চালু হয়েছিল


1
pip show1.4rc5 সংস্করণে চালু হয়েছিল, এবং উপস্থিত রয়েছে (লেখার মতো বর্তমান) 1.4.1
ড্রেভিকো

10
এটি আমার প্রশ্নের সঠিক উত্তর দেয় না, কারণ এটি পিতামাতার পরিবর্তে একটি নির্দিষ্ট প্যাকেজের জন্য বাচ্চাদের (নির্ভরতা) দেখায়। তবে এই কমান্ডটি ব্যবহার করে প্রতিটি প্যাকেজের নির্ভরতা যাচাই করতে একসাথে কিছু ছুঁড়ে ফেলা সহজ। সুতরাং, উদাহরণস্বরূপ, আমি নির্ধারণ করতে পারি যে ইনস্টল করা প্যাকেজটির জন্য পাইওয়াইএমএল প্রয়োজন।
মার্ক চ্যাকারিয়ান

4
আমার আগের মতামত অনুসারে, এই শেল কমান্ডটি আমার ইনস্টল করা প্রতিটি প্যাকেজগুলির জন্য সমস্ত নির্ভরতা ফেলে দেয়: পিপ ফ্রিজ | grep -v "\ -e" | সেড এস /\=\=.*// | awk 'সিস্টেম ("
পাইপ

আমার পূর্ববর্তী মন্তব্য থেকে স্ক্রিপ্টের একটি আপডেট সংস্করণ হ'ল pip freeze | grep -v "\-e" | sed s/\=\=.*// | awk 'system("pip show " $1)' | grep -E '^(Name:|Requires:)' | sed s/Name:/\\\nName:/ - তবে মনে হচ্ছে পিপডপ্ট্রি এখন আরও ভাল সমাধান।
মার্ক চ্যাকারিয়ান

14

যেমন আমি সম্প্রতি এইচএন থ্রেডে বলেছি, আমি নিম্নলিখিতগুলি সুপারিশ করব:

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.rawআপনার পুরোটি পুনর্নির্মাণের জন্য সংস্করণ নিয়ন্ত্রণ সহ আপনি একটি ক্লিন রাখতে পারেন requirements.txt
  • প্রক্রিয়াটিতে ডিমের নাম দ্বারা প্রতিস্থাপন করা গিট ইউআরএল থেকে সাবধান থাকুন।
  • আপনার নির্ভরতাগুলির নির্ভরতাগুলি এখনও বর্ণানুক্রমিকভাবে সাজানো হয়েছে যাতে আপনি সরাসরি জানেন না কোন প্যাকেজ দ্বারা কোনটি প্রয়োজন ছিল তবে এই মুহুর্তে আপনার সত্যিকার প্রয়োজন নেই।
  • pip install --no-install <package_name>নির্দিষ্ট প্রয়োজনীয়তা তালিকাবদ্ধ করতে ব্যবহার করুন ।
  • আপনি যদি না করেন তবে ভার্চুয়ালেনভ ব্যবহার করুন ।

1
আমি কেন বুঝতে পারি না কেন এটি pip freeze -r requirements.txtব্যাপকভাবে ব্যবহৃত হয় না। নির্ভরতা এবং উপ-নির্ভরতা বজায় রাখার জন্য খুব দরকারী।
Penkey সুরেশ

1
ছোট নোট: pip installআর সমর্থন করে না --no-install
রায়ান

7

আপনি একটি ওয়ান লাইন কমান্ডও ব্যবহার করতে পারেন যা পাইপ শোতে প্রয়োজনীয় প্যাকেজগুলিকে পাইপ দেয়।

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

1
প্রয়োজনীয়তার বিন্যাস হিসাবে সাধারণত আপনি পারবেন না <package_name>==<package_version>। Txt এর চেয়ে জটিল ।
পাইওটর ডব্রোগোস্ট

3

প্রথমে pip freezeইনস্টল করা সমস্ত প্যাকেজ পাইথন প্রদর্শন করে, পিআইপি ব্যবহার করার প্রয়োজন হয় না।

দ্বিতীয়ত পাইথন প্যাকেজগুলিতে নির্ভরযোগ্য প্যাকেজগুলির পাশাপাশি প্রয়োজনীয় সংস্করণ সম্পর্কিত তথ্য থাকে । আপনি এখানে বর্ণিত পদ্ধতি ব্যবহার করে নির্দিষ্ট পিকেজির নির্ভরতা দেখতে পাচ্ছেন । আপনি যখন কোনও প্যাকেজ আপগ্রেড করবেন তখন পিআইপি এর মতো ইনস্টলার স্ক্রিপ্ট আপনার জন্য নির্ভরতার আপগ্রেড পরিচালনা করবে।

প্যাকেজগুলির আপডেটের সমাধানের জন্য আমি পিআইপি প্রয়োজনীয় ফাইলগুলি ব্যবহার করার পরামর্শ দিই । আপনার প্রয়োজনীয় প্যাকেজ এবং সংস্করণগুলি সংজ্ঞায়িত করতে পারেন এবং পাইপ ইনস্টলটি ব্যবহার করে সেগুলি একবারে ইনস্টল করতে পারেন।


3

পিপআপগ্রেড ব্যবহার করুন !

$ pip install pipupgrade
$ pipupgrade --format tree --all --check

পাইপআপগ্রেড একটি নির্ভরতা গ্রাফ প্রদর্শন করে এবং সম্ভাব্য আপডেটের জন্য প্রতিটি প্যাকেজ হাইলাইট করে (শব্দার্থক সংস্করণের উপর ভিত্তি করে)। এটি একটি সুন্দর উপায়ে বিরোধী শিশু নির্ভরতা প্রদর্শন করে। pipupgradeএকাধিক পাইথন পরিবেশে উপস্থিত প্যাকেজগুলি আপগ্রেড করার বিষয়টিও নিশ্চিত করে। পাইথন 2.7 +, পাইথন 3.4 + এবং পাইপ 9 +, পিপ 10 +, পিপ 18 +, পিপ 19 + এর সাথে সামঞ্জস্যপূর্ণ।

এখানে চিত্র বর্ণনা লিখুন


1

(কার্যকরী, সঠিক উত্তর নয়)

LxML ইনস্টল না করা এবং আমার কে lxML প্রয়োজন তা জানতে চাইলে একই সমস্যা ছিল। LXML কে দরকার নেই । দ্বারা ইস্যু বাইপাস শেষ।

  1. আমার সাইটের প্যাকেজগুলি কোথায় রাখা হয়েছিল তা লক্ষ্য করে।

  2. সেখানে যান এবং আমদানির জন্য পুনরাবৃত্তিমূলক গ্রেপ (সর্বশেষ গ্রেপের নিজস্ব - ইনভার্ট-ম্যাচ lxML এর নিজস্ব ফাইল বিবেচনা থেকে অপসারণ করতে পরিবেশন করে)।

হ্যাঁ, কীভাবে এটি করতে পাইপ ব্যবহার করবেন সে সম্পর্কে কোনও উত্তর নয়, তবে যে কোনও কারণেই হোক, আমি এখানে পরামর্শগুলি থেকে কোনও সাফল্য পাইনি।

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

1

এই সমস্যাটি সমাধান করার জন্য আমি একটি দ্রুত স্ক্রিপ্ট লিখেছিলাম। নিম্নলিখিত স্ক্রিপ্টটি প্রদত্ত প্যাকেজের জন্য প্যারেন্ট (নির্ভর) প্যাকেজ (গুলি) প্রদর্শন করবে। এইভাবে আপনি নিশ্চিত হতে পারেন যে কোনও নির্দিষ্ট প্যাকেজ আপগ্রেড বা ইনস্টল করা নিরাপদ। এটি নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:dependants.py PACKAGENAME

#!/usr/bin/env 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._internal.utils.misc.get_installed_distributions():
        for requirement_package in package.requires():
            requirement_name = requirement_package.project_name
            if requirement_name == target_name:
                yield package.project_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)))

এটি আর কাজ করে না কারণ get_installed_distributions()পদ্ধতিটি আর পাওয়া যায় না। github.com/pypa/pip/issues/5243
ফিল গাইফোর্ড 7'19
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.