2010-06-28 23 views
21

यह शायद एक स्पष्ट उत्तर है, लेकिन मैं एक नौसिखिया हूं। मुझे एक "मॉड्यूल" मिला है (वास्तव में केवल उन फाइलों का एक समूह है जो मैं अक्सर उपयोग करता हूं) जिसकी शुरुआत में मैं कई अन्य मॉड्यूल आयात करता हूं। क्योंकि मैं कई प्रणालियों पर काम करता हूं, हालांकि, सभी मॉड्यूल किसी भी विशेष मशीन पर लोड करने में सक्षम नहीं हो सकते हैं। चीजों को थोड़ा और कठिन बनाने के लिए, जब मैं उन्हें आयात करता हूं तो संकुल के नाम भी बदलते हैं - उदाहरण के लिए, matplotlib को संक्षिप्त रूप से mp में संक्षिप्त किया जाता है।मॉड्यूल आयात करते समय त्रुटि प्रबंधन

मैं जो करना चाहता हूं वह केवल उन मॉड्यूल को लोड करता है जो वर्तमान में उपयोग कर रहे सिस्टम पर मौजूद हैं, और उन लोगों पर कुछ त्रुटि प्रबंधन करते हैं जो नहीं करते हैं। ऐसा करने का एकमात्र तरीका मैं ऐसा कर सकता हूं कि प्रत्येक आयात कथन को अपने स्वयं के प्रयास ब्लॉक के अंदर संलग्न करना, जो कि बहुत ही अनियंत्रित लगता है। यदि मैं उन्हें एक ही कोशिश ब्लॉक में संलग्न करता हूं, जो भी मॉड्यूल एक त्रुटि फेंकता है, उसके बाद के मॉड्यूल को लोड होने से रोका जाएगा। कोई विचार जो चीजों को सुंदर दिख सकता है? अगर मैं उनके नाम बदलना नहीं चाहता तो यह इतना आसान होगा ...

+2

"छोटा सा भूत" मॉड्यूल आप मदद करनी चाहिए। आप इसे पढ़ना चाहेंगे: http://docs.python.org/library/imp.html – mawimawi

+1

@ माविमावी: कैसे? कृपया अपनी टिप्पणी को उचित उत्तर में समझाएं और विस्तृत करें? (मैंने दस्तावेज़ पढ़ा और यह स्पष्ट नहीं है कि हम किसी अन्य दृष्टिकोण से किसी भी मॉड्यूल का उपयोग क्यों करना चाहते हैं) – smci

उत्तर

30

मुझे नहीं लगता कि try except ब्लॉक गैर-पायथनिक है; इसके बजाय पायथन पर आयात को संभालने का यह एक आम तरीका है।

Dive into Python का हवाला देते हुए:

वास्तविक त्रुटि की स्थिति से निपटने के अलावा अपवाद के लिए अन्य उपयोगों का एक बहुत हैं। मानक पायथन पुस्तकालय में एक सामान्य उपयोग एक मॉड्यूल आयात करने का प्रयास करना है, और फिर जांचें कि क्या यह काम करता है। एक मॉड्यूल आयात करना जो मौजूद नहीं है आयात त्रुटि अपवाद बढ़ाएगा। आप कौन-से मॉड्यूल रन-टाइम में, या समर्थन कई प्लेटफार्मों (जहां प्लेटफ़ॉर्म-विशिष्ट कोड विभिन्न मॉड्यूल में अलग किया जाता है) के लिए उपलब्ध हैं के आधार पर कार्यक्षमता के अनेक स्तर निर्धारित करने के लिए कर सकती हैं।

अगला उदाहरण दर्शाता है कि प्लेटफ़ॉर्म-विशिष्ट कार्यक्षमता का समर्थन करने के लिए अपवाद का उपयोग कैसे करें।

try: 
    import termios, TERMIOS      
except ImportError: 
    try: 
     import msvcrt       
    except ImportError: 
     try: 
      from EasyDialogs import AskPassword 
     except ImportError: 
      getpass = default_getpass   
     else:         
      getpass = AskPassword 
    else: 
     getpass = win_getpass 
else: 
    getpass = unix_getpass 
4

सबसे आसान तरीका यह सुनिश्चित करें कि सभी मॉड्यूल सभी सिस्टम पर लोड किया जा सकता है। यदि यह काम नहीं करता है, तो प्रत्येक import स्टेटमेंट को try ब्लॉक में संलग्न करना अगला सबसे अच्छा समाधान है और बिल्कुल गैर-पायथनिक नहीं है।

0

https://stackoverflow.com/a/20228312/1587329 द्वारा की वकालत के रूप में [संशोधित]

named_libs = [('numpy', 'np'), ('matplotlib', 'mp')] # (library_name, shorthand) 
for (name, short) in named_libs: 
    try: 
     lib = __import__(name) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[short] = lib 

named_libs में सभी पुस्तकालयों आयात करता है। पहली स्ट्रिंग लाइब्रेरी का नाम है, दूसरा शॉर्टेंड है। अनाम पुस्तकालयों के लिए, आप the original उपयोग कर सकते हैं:

libnames = ['numpy', 'scipy', 'operator'] 
for libname in libnames: 
    try: 
     lib = __import__(libname) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[libname] = lib 
संबंधित मुद्दे