2009-04-20 9 views
7

मॉड्यूल के नाम दिए जाने पर मॉड्यूल का एक सेट स्थापित किया जा सकता है या नहीं। जैसेपाइथन मॉड्यूल निर्भरताओं के लिए टेस्ट स्थापित किया जा रहा है

modules = set(["sys", "os", "jinja"]) 

for module in modules: 
    # if test(module exists): 
    # do something 

हालांकि यह रूप में परीक्षण को लिखने के लिए संभव है:

try: 
    import sys 
except ImportError: 
    print "No sys!" 

यह है कि मैं क्या कर रहा हूँ के लिए एक सा बोझिल है। क्या ऐसा करने का कोई गतिशील तरीका है?

मैंने eval ("आयात% s"% मॉड्यूल) की कोशिश की है लेकिन यह संकलन त्रुटि की शिकायत है।

मैं आपके विचारों और सुझावों के लिए आभारी हूं। धन्यवाद।

उत्तर

8

आप उपयोग कर सकते हैं __import__() समारोह इस तरह ::

for module in modules: 
    try: 
     __import__(module) 
    except ImportError: 
     do_something() 

तुम भी imp.find_module उपयोग कर सकते हैं एक मॉड्यूल पाया जा सकता है कि क्या यह निर्धारित करने के बिना आयात ::

import imp 
for module in modules: 
    try: 
     imp.find_module(module) 
    except ImportError: 
     do_something() 

ओह, और कारण आप eval() का उपयोग नहीं कर सकते हैं क्योंकि import एक कथन है, अभिव्यक्ति नहीं। आप कर सकते हैं उपयोग exec आप वास्तव में है, हालांकि मैं इसे :: की सिफारिश नहीं होगा चाहते हैं

for module in modules: 
    try: 
     exec 'import ' + module 
    except ImportError: 
     do_something() 
6

इसमें क्या गलत है?

modules = set(["sys", "os", "jinja"]) 
for m in modules: 
    try: 
     __import__(m) 
    except ImportError: 
     # do something 

उपर्युक्त __import__ फ़ंक्शन का उपयोग करता है। साथ ही, यह सख्ती से परीक्षण कर रहा है कि यह मौजूद है या नहीं - यह वास्तव में कहीं भी आयात को सहेज नहीं रहा है, लेकिन आप इसे आसानी से संशोधित कर सकते हैं।

2
modules = set(["sys", "os", "jinja"]) 
try: 
    for module in modules: 
    __import__(module) 
    doSomething() 
except ImportError, e: 
    print e 
5

यह find_module दृष्टिकोण और __import__ दृष्टिकोण के बीच समझौतों से समझने लायक है:

  • __import__('foo') मॉड्यूल लोड करने के किसी भी दुष्प्रभाव को ट्रिगर करेगा, भले ही आप आयातित मॉड्यूल का संदर्भ सहेज लें। यह ठीक हो सकता है, या नहीं।
  • find_module('foo') किसी भी दुष्प्रभाव को ट्रिगर नहीं करेगा, इसलिए यह हमेशा सुरक्षित होना चाहिए।
  • neither approach works अच्छी तरह अगर the module है found लेकिन है अन्य problems पर load समय (eg। SyntaxError, NameError ...)
  • Depending पर कैसे आप handle failures, simply wrapping __import__('foo') में try/except will दे यदि आप foo पाए जाते हैं तो आप भ्रामक परिणाम निकालते हैं लेकिन foo आयात बार जो नहीं मिला है।
  • find_module() बिंदीदार नाम नहीं संभाल कर सकते हैं, तो आप जांच करने के लिए है कि क्या 'foo.bar.bat.baz' आयात किया जा सकता की जरूरत है, तो आप find_module करने के लिए कई कॉल का उपयोग करने के लिए है और docs.
अनुसार load_module
संबंधित मुद्दे

 संबंधित मुद्दे