পাইথন প্যাকেজ ইনস্টল করা আছে কিনা তা পরীক্ষা করে দেখুন


112

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

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

চেকটি সম্পন্ন করার জন্য আমার ধারণাগুলি

  • সাধারণ ইনস্টলের পথে কোনও ডিরেক্টরি অনুসন্ধান করুন
  • প্যাকেজটি আমদানির চেষ্টা করুন এবং যদি কোনও ব্যতিক্রম হয় তবে প্যাকেজ ইনস্টল করুন

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

উত্তর:


106

যদি আপনি একটি অজগর স্ক্রিপ্ট বোঝাতে চান তবে ঠিক এর মতো কিছু করুন:

পাইথন 3.3+ ব্যবহার sys.modules এবং find_spec :

import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you choose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

পাইথন 3:

try:
    import mymodule
except ImportError as e:
    pass  # module doesn't exist, deal with it.

পাইথন 2:

try:
    import mymodule
except ImportError, e:
    pass  # module doesn't exist, deal with it.

6
সতর্কতা: আমার সবেমাত্র একটি পরিস্থিতি ছিল যেখানে মডিউলটির মধ্যেই ইম্পোর্টেরর ফেলে দেওয়া হয়েছিল। এটি প্রায়শই ঘটে না, তবে কেবল সচেতন থাকুন যে এই চেকটি সব ক্ষেত্রেই নির্ভরযোগ্য নয়।
কোইন বোক

7
এটি কেবল পরীক্ষা করে না ; এটি এটি আমদানি করে; এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
জর্জি লিটাও

6
হ্যাঁ. সাধারণত আপনি যা চান আপনি আরও পরিশীলিত চেক করতে আমদানি সরঞ্জাম মডিউলটি ব্যবহার করতে পারেন, তবে বেশিরভাগ সময় মডিউল ইনস্টল হওয়া আপনার যত্নের একমাত্র কারণ আপনি এটি ব্যবহার করতে চান।
ক্রিস্টোফার

আপনার যদি প্যাকেজের মতো একই নামযুক্ত অন্য ফাইল থাকে তবে এটি ব্যর্থ হবে।
নীলা_আটকটি

অবশ্যই, তবে এটি সম্পূর্ণ আলাদা সমস্যা। আপনার অনুসন্ধানের পথে একই নামে দুটি পৃথক মডিউল বা প্যাকেজ থাকলে আপনি সমস্যায় পড়েছেন।
ক্রিস্টোফার

56

আপডেট উত্তর

এটি করার আরও ভাল উপায় হ'ল:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]

ফলাফল:

print(installed_packages)

[
    "Django",
    "six",
    "requests",
]

requestsইনস্টল করা আছে কিনা তা পরীক্ষা করুন :

if 'requests' in installed_packages:
    # Do something

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

দ্রষ্টব্য, প্রস্তাবিত সমাধান কাজ করে:

  • পিপিআই বা অন্য কোনও বিকল্প উত্স (যেমন pip install http://some.site/package-name.zipবা অন্য কোনও সংরক্ষণাগার ধরণ) থেকে ইনস্টল করতে পিপ ব্যবহার করার সময় ।
  • ম্যানুয়ালি ব্যবহার করে ইনস্টল করার সময় python setup.py install
  • সিস্টেম সংগ্রহস্থল থেকে ইনস্টল করার সময়, পছন্দ করুন sudo apt install python-requests

কেসগুলি যখন এটি কাজ নাও করতে পারে :

  • বিকাশ মোডে ইনস্টল করার সময়, পছন্দ করুন python setup.py develop
  • বিকাশ মোডে ইনস্টল করার সময়, পছন্দ করুন pip install -e /path/to/package/source/

পুরানো উত্তর

এটি করার আরও ভাল উপায় হ'ল:

import pip
installed_packages = pip.get_installed_distributions()

পাইপ> = 10.x ব্যবহারের জন্য:

from pip._internal.utils.misc import get_installed_distributions

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

ফলস্বরূপ, আপনি pkg_resources.Distributionবস্তুর একটি তালিকা পাবেন get নিম্নলিখিত হিসাবে একটি উদাহরণ হিসাবে দেখুন:

print installed_packages
[
    "Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
    "six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
    "requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]

এটির একটি তালিকা তৈরি করুন:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

requestsইনস্টল করা আছে কিনা তা পরীক্ষা করুন :

if 'requests' in flat_installed_packages:
    # Do something

2
অন্য উত্তরে যেমন উল্লেখ করা হয়েছে, ত্রুটিটি ধরা না পড়ার সম্ভাবনা রয়েছে। সুতরাং আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
জোরিক স্লিজস্টার

1
এই পদ্ধতিটি 'json' প্যাকেজগুলির সাথে কাজ করে না ( import jsonপ্রকৃতপক্ষে কাজ করার সময় মিথ্যা প্রত্যাবর্তন করে)। আইস.নাইকারের পদ্ধতি এই ক্ষেত্রে কাজ করছে।
মাউন্ট্রিক্স

1
আমার if "u'requests'" in installed_packages:পক্ষে কাজ করার জন্য কোনওভাবে আমার আপডেট উত্তর থেকে চেকটি ব্যবহার করা দরকার । আউটপুটটি print()আমার ম্যাকোস অজগরটিতে এটি উত্পাদন করে:[..., u'pytz', u'requests', ...]
বুজু

1
@ আর্টার বার্সেঘ্যান আমি পাইথন ২.7.১০ তে আছি (ম্যাকোস সিস্টেম পাইথন) ... আসলে আমাকে ব্যবহার করতে হবে if "requests'"(শেষে একক উদ্ধৃতিটি লক্ষ্য করুন)। মোটেই বোঝা যায় না।
বুজু

1
এটি প্রশ্নের উত্তর দেয় না: "প্যাকেজটি 'x' ইনস্টল করা আছে?" প্যাকেজটি ব্যবহার না করে ইনস্টল করার বিভিন্ন উপায় রয়েছে pip। উদাহরণস্বরূপ, আপনি উত্স থেকে একটি প্যাকেজ তৈরি এবং ইনস্টল করতে পারেন। এই উত্তরটি সেগুলি খুঁজে পাবে না। @ আইস.অনিকার সম্পর্কে উত্তরটি find_spec()সঠিক is
আর্থার

43

পাইথন ৩.৩ অনুসারে আপনি ফাইন্ড_স্পেক () পদ্ধতিটি ব্যবহার করতে পারেন

import importlib.util

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")

4
পরিষ্কার এবং সহজ, সেরা উত্তর এখানে। এটির জন্য আরও বেশি পরিমাণের প্রয়োজন।
ডেভিড পার্কস

5
সতর্ক হোন. যদি প্যাকেজের নামটিতে ড্যাশ থাকে তবে আপনি বিন্দু ব্যবহার না করে Find_spec () এটি খুঁজে পাবে না। উদাহরণ: importlib.util.find_spec('google-cloud-logging')সন্ধানের সময় কিছুই খুঁজে পায় না importlib.util.find_spec('google.cloud.logging')। পিপ শোয়ের অফিশিয়াল নাম এবং নামটি বিন্দু নয়, ড্যাশ সহ। বিভ্রান্ত হতে পারে তাই সাবধানতার সাথে ব্যবহার করুন।
দ্বৈত

27

আপনি যদি টার্মিনাল থেকে চেক করতে চান তবে আপনি চালাতে পারেন

pip3 show package_name

এবং যদি কিছুই ফেরত না পাওয়া যায় তবে প্যাকেজ ইনস্টল করা হবে না।

সম্ভবত আপনি যদি এই চেকটি স্বয়ংক্রিয় করতে চান, যাতে উদাহরণস্বরূপ আপনি অনুপস্থিত থাকলে এটি ইনস্টল করতে পারেন, আপনার ব্যাশ স্ক্রিপ্টে আপনার নিম্নলিখিতগুলি থাকতে পারে:

pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
   echo "Installed" #Replace with your actions
else
   echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi

এটি দুর্দান্ত বলে মনে হচ্ছে তবে এটি আমার জন্য সর্বদা "ইনস্টলড নয়" প্রত্যাবর্তন করে। কেন?
এলিপটিকা

আপনি কি "$ পাইপ 3 সংস্করণ" এবং "$ পিপি 3 শো প্যাকেজ_নাম" এর আউটপুট ভাগ করতে পারবেন, যেখানে আপনি পছন্দসই প্যাকেজের সাথে প্যাকেজ_নামটি প্রতিস্থাপন করবেন?
ওগজেন ভুকোভিচ

শেল টিপ: আপনি ifসরাসরি একটি সফল কমান্ড পরীক্ষা করতে ব্যবহার করতে পারেন :if pip3 show package_name 1>/dev/null; then ...
MestreLion

6

এই উত্তরের সম্প্রসারণ হিসাবে :

পাইথন ২ এর জন্য। * pip show <package_name>একই কাজটি সম্পাদন করবে।

উদাহরণস্বরূপ pip show numpyনিম্নলিখিতগুলি বা একইভাবে ফিরিয়ে দেবে:

Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires: 
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy

কোনও স্ক্রিপ্ট থেকে নয় তবে কমান্ড লাইন পরীক্ষার জন্য দুর্দান্ত। ধন্যবাদ
জেজে রিভারো

3

আপনি সেটআপলুলগুলি থেকে pkg_resورس মডিউলটি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

import pkg_resources

package_name = 'cool_package'
try:
    cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
    print('{} not installed'.format(package_name))
else:
    print(cool_package_dist_info)

লক্ষ করুন যে পাইথন মডিউল এবং পাইথন প্যাকেজের মধ্যে পার্থক্য রয়েছে। একটি প্যাকেজে একাধিক মডিউল থাকতে পারে এবং মডিউলটির নাম প্যাকেজের নামের সাথে মেলে না।



1

আমি এই বিষয়টিতে আমার কিছু চিন্তাভাবনা / অনুসন্ধান যুক্ত করতে চাই। আমি একটি স্ক্রিপ্ট লিখছি যা একটি কাস্টম তৈরি প্রোগ্রামের জন্য সমস্ত প্রয়োজনীয়তা পরীক্ষা করে। পাইথন মডিউলগুলির সাথে অনেকগুলি চেক রয়েছে।

এর সাথে একটি সামান্য সমস্যা আছে

try:
   import ..
except:
   ..

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

আমি এটিও খুঁজে পেয়েছি

import pip
installed_packages = pip.get_installed_distributions()

installed_packagesথাকবে শুধুমাত্র প্যাকেজ হয়েছে পিপ দিয়ে ইনস্টল । আমার সিস্টেমে পাইথন মডিউলগুলি pip freezeদিয়ে ফিরে আসে 40, যখন installed_packagesকেবলমাত্র 1এটিই আমি ম্যানুয়ালি ইনস্টল করেছি (পাইথন-এনএম্যাপ)।

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

সমাধান যে আমার জন্য কাজ করে। এটি এই উত্তরের উপর ভিত্তি করে কীভাবে অজগর মডিউলটি আমদানি না করে বিদ্যমান কিনা তা পরীক্ষা করতে হবে

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

দ্রষ্টব্য: এই সমাধানটি নামেও মডিউলটি সন্ধান করতে পারে না python-nmap, তার nmapপরিবর্তে আমাকে ব্যবহার করতে হবে (এর সাথে বেঁচে থাকা সহজ) তবে এই ক্ষেত্রে মডিউলটি যা যা মেমরির মধ্যে লোড হবে না।


0

যদি আপনি আপনার স্ক্রিপ্টটি হারিয়ে যাওয়া প্যাকেজগুলি ইনস্টল করতে চান এবং চালিয়ে যেতে চান তবে আপনি এটির মতো কিছু করতে পারেন (উদাহরণস্বরূপ 'পাইথন-কেআরবিভি' প্যাকেজে 'কেআরবিভি' মডিউল):

import pip
import sys

for m, pkg in [('krbV', 'python-krbV')]:
    try:
        setattr(sys.modules[__name__], m, __import__(m))
    except ImportError:
        pip.main(['install', pkg])
        setattr(sys.modules[__name__], m, __import__(m))

0

একটি দ্রুত উপায় হল পাইথন কমান্ড লাইন সরঞ্জামটি ব্যবহার করা । সহজভাবে টাইপ করুন import <your module name> মডিউলটি অনুপস্থিত থাকলে আপনি একটি ত্রুটি দেখতে পাচ্ছেন।

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> import sys
>>> import jocker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$

0

হুম্ম ... ... আমি একটি সুনির্দিষ্ট উত্তরের নিকটতমটি দেখেছি আমদানির চেষ্টা করার জন্য কমান্ড লাইনটি ব্যবহার করা হয়েছিল। তবে আমি তা এড়াতেও পছন্দ করি।

কীভাবে 'পিপ ফ্রিজ | গ্রেপ পিকেগনেমে '? আমি এটি চেষ্টা করেছিলাম এবং এটি ভাল কাজ করে। এটি আপনাকে এটির সংস্করণও দেখায় এবং এটি সংস্করণ নিয়ন্ত্রণের অধীনে ইনস্টল করা আছে কিনা (ইনস্টল) বা সম্পাদনাযোগ্য (বিকাশ)।


0

ক্লাস মাইআরআর (ব্যতিক্রম): পাস # বা কিছু চেষ্টা করে দেখুন: ইম্পোর্টেরিয়ার ছাড়া মাইমডিউল আমদানি করুন e: MyError বাড়ান ("ত্রুটি ঘটেছে")



0

আমি @ বরফ.উত্তর জবাবে মন্তব্য করতে চাই তবে আমি পারব না, তাই ... আমার পর্যবেক্ষণটি হ'ল যে ড্যাশযুক্ত প্যাকেজগুলি কেবলমাত্র ডট দ্বারা নয় আন্ডারস্কোর দিয়ে সংরক্ষণ করা হবে, @ ডুইচের মন্তব্যে উল্লেখ করা হয়েছে

উদাহরণস্বরূপ, আপনি করেন pip3 install sphinx-rtd-themeতবে:

  • importlib.util.find_spec(sphinx_rtd_theme) একটি অবজেক্ট প্রদান করে
  • importlib.util.find_spec(sphinx-rtd-theme) কিছুই ফেরত দেয় না
  • importlib.util.find_spec(sphinx.rtd.theme) ModuleNotFoundError উত্থাপন করে

তদুপরি, কিছু নাম পুরোপুরি পরিবর্তিত হয়। উদাহরণস্বরূপ, আপনি এটি করেন pip3 install pyyamlতবে এটি কেবল হিসাবে সংরক্ষণ করা হয়yaml

আমি পাইথন ৩.৮ ব্যবহার করছি



-1

বিকল্প # 2 যান। যদি ImportErrorনিক্ষেপ করা হয় তবে প্যাকেজটি ইনস্টল করা হয়নি (বা এতে নেই sys.path)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.