2009-06-26 22 views
63

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

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

जांच ठेठ में एक निर्देशिका के लिए

  • जांच को पूरा करने को स्थापित पथ
  • कोशिश पैकेज आयात करने के लिए और अगर एक अपवाद फेंक है, तो स्थापित पैकेज
+0

किस प्रकार की स्क्रिप्ट? – Christopher

+0

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

उत्तर

70

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

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

धन्यवाद, बहुत सराहना की। – Kevin

+4

चेतावनी: मुझे बस एक ऐसी स्थिति थी जहां मॉड्यूल के भीतर ImportError फेंक दिया गया था। यह अक्सर नहीं होना चाहिए, लेकिन केवल यह पता होना चाहिए कि यह जांच सभी मामलों में विश्वसनीय नहीं है। –

+3

यह न केवल * चेक * करता है; यह भी आयात करता है; यह भी देखें http://stackoverflow.com/questions/14050281/how-to-check-if-a-python- मॉड्यूल-exists-without-importing-it –

-2

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

34

ऐसा करने का एक बेहतर तरीका है:

import pip 
installed_packages = pip.get_installed_distributions() 

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

परिणामस्वरूप, आपको pkg_resources.Distribution ऑब्जेक्ट्स की एक सूची मिलती है।

flat_installed_packages = [package.project_name for package in installed_packages] 

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

चेक अगर requests स्थापित किया गया है:

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)", 
] 

यह की एक सूची बनाएँ: एक उदाहरण के रूप में निम्न देखें

if 'requests' in flat_installed_packages: 
    # Do something 
+0

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

6

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

import importlib.util 
import sys 

# For illustrative purposes. 
package_name = 'pandas' 

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

मैं इस विषय में अपने कुछ विचार/निष्कर्ष जोड़ना चाहता हूं। मैं एक ऐसी स्क्रिप्ट लिख रहा हूं जो कस्टम किए गए कार्यक्रम के लिए सभी आवश्यकताओं की जांच करता है। पाइथन मॉड्यूल के साथ भी कई जांच हैं।

try: 
    import .. 
except: 
    .. 

समाधान के साथ एक छोटे से मुद्दे नहीं है। मेरे मामले में पाइथन मॉड्यूल में से एक को python-nmap कहा जाता है, लेकिन आप इसे import nmap के साथ आयात करते हैं और जैसा कि आप नाम मेल नहीं खाते हैं। इसलिए उपरोक्त समाधान के साथ परीक्षण एक झूठा परिणाम देता है, और यह हिट पर मॉड्यूल भी आयात करता है, लेकिन शायद एक साधारण परीक्षण/जांच के लिए बहुत सारी मेमोरी का उपयोग करने की आवश्यकता नहीं है।

मैंने यह भी पाया कि

import pip 
installed_packages = pip.get_installed_distributions() 

installed_packages केवल संकुल होगा पिप के साथ स्थापित किया गया है। मेरे सिस्टम पर pip freeze40 पायथन मॉड्यूल पर लौटाता है, जबकि installed_packages में केवल 1 है, जिसे मैंने मैन्युअल रूप से इंस्टॉल किया है (पायथन-एनएमएपी)।

कि नीचे एक अन्य समाधान मैं यह पता सकता है सवाल के लिए प्रासंगिक नहीं है, लेकिन मुझे लगता है कि यह एक अच्छा अभ्यास है परीक्षण समारोह अलग एक स्थापित यह कुछ के लिए उपयोगी हो सकता है लोगों को उस से रहते हैं।

समाधान जो मेरे लिए काम करता है। यह इस उत्तर के आधार पर How to check if a python module exists without importing it

from imp import find_module 

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

नोट: इस समस्या का समाधान नहीं भी नाम python-nmap द्वारा मॉड्यूल पा सकते हैं, मैं nmap बजाय का उपयोग करने के (आसान साथ रहने के लिए) है, लेकिन इस मामले में मॉड्यूल नहीं होगा स्मृति को लोड किया जाना चाहिए।

5

आप टर्मिनल से जांच करना चाहते हैं, तो आप

pip3 show package_name 

चला सकते हैं और यदि कुछ भी नहीं दिया जाता है, पैकेज स्थापित नहीं है।

शायद आप इस चेक को स्वचालित करने, इसलिए उदाहरण के लिए आप अगर लापता स्थापित कर सकते हैं चाहते हैं, तो आप अपने bash लिपि में निम्नलिखित हो सकते हैं:

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 
0

आप स्थापित करने के लिए अपनी स्क्रिप्ट चाहते हैं गुम पैकेज और जारी रखें, आप इस तरह कुछ कर सकते हैं ('python-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)) 
संबंधित मुद्दे