जांचें कि क्या पायथन पैकेज स्थापित है


112

यह जांचने का एक अच्छा तरीका क्या है कि पायथन स्क्रिप्ट के भीतर कोई पैकेज स्थापित किया गया है? मुझे पता है कि दुभाषिया से यह आसान है, लेकिन मुझे इसे एक स्क्रिप्ट के भीतर करने की आवश्यकता है।

मुझे लगता है कि मैं जाँच कर सकता हूँ कि संस्थापन के दौरान बनाई गई प्रणाली पर कोई निर्देशिका है, लेकिन मुझे लगता है कि वहाँ एक बेहतर तरीका है। मैं यह सुनिश्चित करने की कोशिश कर रहा हूं कि Skype4Py पैकेज स्थापित है, और नहीं तो मैं इसे स्थापित करूंगा।

चेक पूरा करने के लिए मेरे विचार

  • ठेठ स्थापित पथ में एक निर्देशिका के लिए जाँच करें
  • पैकेज आयात करने का प्रयास करें और यदि कोई अपवाद फेंक दिया जाता है, तो पैकेज स्थापित करें

स्काइप शुरू करने और पैकेट डेटा एकत्र करने के लिए tcpdump का उपयोग करने के लिए पायथन स्क्रिप्ट लिखना ताकि मैं यह विश्लेषण कर सकूं कि जब आपके पास कॉन्फ्रेंस कॉल है तो नेटवर्क कैसे कार्य करता है।
केविन

जवाबों:


107

यदि आप एक अजगर स्क्रिप्ट का मतलब, बस कुछ इस तरह से करते हैं:

पायथन 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
यह केवल जाँच नहीं करता है ; यह भी इसे आयात करता है; यह भी देखें stackoverflow.com/questions/14050281/…
जॉर्ज लीताओ

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

इस तरह क्यों? कभी-कभी आपके पास ऐप का नाम टकराव होता है। ऐप नामस्थान से आयात करने से आपको सिस्टम पर स्थापित की गई पूरी तस्वीर नहीं मिलती है।

ध्यान दें, प्रस्तावित समाधान काम करता है:

  • जब PyPI या किसी अन्य वैकल्पिक स्रोत (जैसे 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वस्तुओं की एक सूची मिलती है । एक उदाहरण के रूप में निम्नलिखित देखें:

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()मेरे macOS अजगर पर करता है:[..., u'pytz', u'requests', ...]
Buju

1
@ArturBarseghyan मैं Python 2.7.10 (macOS सिस्टम python) पर हूं ... वास्तव में मुझे उपयोग करना है if "requests'"(अंत में एकल उद्धरण देखें)। बिल्कुल समझ में नहीं आता है।
बुजू १

1
यह इस सवाल का जवाब नहीं देता: "पैकेज 'x' स्थापित है?"। उपयोग किए बिना पैकेज को स्थापित करने के कई तरीके हैं pip। उदाहरण के लिए, आप स्रोत से पैकेज बना और स्थापित कर सकते हैं। यह उत्तर उन लोगों को नहीं मिलेगा। @ Ice.nicer के बारे में उत्तर find_spec()सही है।
आर्थर

43

पायथन 3.3 के रूप में, आप find_spec () विधि का उपयोग कर सकते हैं

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')पाया जाता है। आधिकारिक नाम और नाम जो पाइप शो डैश के साथ है, डॉट्स के साथ नहीं। भ्रमित हो सकता है इसलिए सावधानी के साथ उपयोग करें।
1919

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

यह बहुत अच्छा लगता है लेकिन यह हमेशा मेरे लिए "Not Installed" लौटता है। क्यों?
एलिप्टिका

क्या आप "$ pip3 -version" और "$ pip3 शो package_name" के आउटपुट को साझा कर सकते हैं, जहाँ आप package_name को वांछित पैकेज से प्रतिस्थापित करते हैं?
ओगनजेन वुकोविक

शेल टिप: आप ifएक सफल कमांड का सीधे परीक्षण करने के लिए उपयोग कर सकते हैं :if pip3 show package_name 1>/dev/null; then ...
MestreLion

6

इस उत्तर के विस्तार के रूप में :

पायथन 2. * के लिए, 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_resource मॉड्यूल का उपयोग कर सकते हैं। उदाहरण के लिए:

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

यदि आप अपनी स्क्रिप्ट को लापता पैकेजों को स्थापित करने और जारी रखने के लिए चाहते हैं, तो आप ऐसा कुछ कर सकते हैं (उदाहरण के लिए 'prthon-krbV' पैकेज में 'krbV' मॉड्यूल):

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

हम्मम ... निकटतम मैंने एक सुविधाजनक उत्तर देखा जो आयात करने की कोशिश करने के लिए कमांड लाइन का उपयोग कर रहा था। लेकिन मैं इससे बचना भी पसंद करता हूं।

कैसे के बारे में 'पाइप फ्रीज | grep pkgname '? मैंने इसकी कोशिश की और यह अच्छी तरह से काम करता है। यह आपके पास उस संस्करण को भी दिखाता है, जो संस्करण नियंत्रण (इंस्टॉल) या संपादन योग्य (विकसित) के तहत स्थापित है या नहीं।


0

वर्ग myError (अपवाद): पास # या कुछ काम करने की कोशिश करते हैं: आयात के अलावा mymodule को e के रूप में आयात करें: myError को बढ़ाएं ("त्रुटि उत्पन्न हुई थी")



0

मैं @ ice.nicer उत्तर पर टिप्पणी करना चाहूंगा, लेकिन मैं ऐसा नहीं कर सकता ... मेरी टिप्पणी है कि डैश वाले पैकेज अंडरस्कोर के साथ सहेजे जाते हैं, न कि डॉट्स के साथ @dwich टिप्पणी द्वारा बताया गया

उदाहरण के लिए, आप करते हैं 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

मैं python3.8 का उपयोग कर रहा हूं



-1

विकल्प # 2 पर जाएं। यदि ImportErrorफेंक दिया गया है, तो पैकेज स्थापित नहीं है (या नहीं sys.path)।

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