2013-02-07 25 views
16

जब कोई स्रोत निर्देशिका में होने पर मॉड्यूल foo आयात करने का प्रयास करता है, तो कोई एक भ्रमित ImportError संदेश: ImportError: No module named foo प्राप्त करता है।स्रोत निर्देशिका से आयात करते समय पाइथन 'आयात त्रुटि' पकड़ें

मैं आसानी से इस मामले को कैसे पकड़ सकता हूं और अधिक जानकारीपूर्ण संदेश लौटा सकता हूं, उदा। 'कृपया स्रोत निर्देशिका से मॉड्यूल foo लोड न करें'?

__init__.py के बाद, मैं शुरू होगा साथ:

try: 
    from _foo import * 
except ImportError: 
    ## check whether in the source directory... 

तो मैं (क्योंकि जैसे foo नाम के एक मॉड्यूल सब पर स्थापित नहीं है) एक ImportError लिए अलग अलग कारणों भेद, और मामले का पता लगाने के लिए करना चाहते हैं जिसमें setup.py वर्तमान निर्देशिका में स्थित है। ऐसा करने का एक शानदार तरीका क्या होगा?

उत्तर

22

ImportError: No module named foo वास्तव में मॉड्यूल foo.py या पैकेज foo/__init__.py खोज पथ में निर्देशिका में से किसी में नहीं पाया जा सका (sys.path सूची) का अर्थ है।

के बाद से sys.path आमतौर पर . (वर्तमान निर्देशिका) शामिल हैं, कि शायद आप स्रोत निर्देशिका में किया जा रहा द्वारा क्या मतलब है। आप पैकेज foo (जहां __init__.py फ़ाइल है) की शीर्ष-स्तरीय निर्देशिका में हैं, इसलिए स्पष्ट रूप से आपको foo/__init__.py नहीं मिल रहा है।

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

try: 
    from _foo import * 
except ImportError: 
    raise ImportError('<any message you want here>') 

वैकल्पिक रूप से, आप sys.path, वर्तमान निर्देशिका की सामग्री की जाँच करें और, अगर जाना जाता है, की उम्मीद पैकेज निर्देशिका और एक उत्पादन कर सकता है यहां तक ​​कि विस्तृत और संदर्भ-जागरूक संदेश भी।

या ..PYTHONPATH पर्यावरण परिवर्तनीय (यूनिक्स पर) को जोड़ने के लिए आपको अपनी स्रोत निर्देशिका से चलाने की अनुमति दें। विंडोज़ पर भी काम कर सकते हैं, लेकिन मुझे नहीं पता।

+0

त्वरित उत्तर के लिए धन्यवाद। मैं यह जांचने का एक तरीका ढूंढ रहा हूं कि 'importError' को मौजूदा निर्देशिका में स्थित' setup.py' द्वारा उठाया गया है और इसे अन्य मामलों से अलग करता है या नहीं। – Julian

+0

तो मैंने उल्लेख किए गए दूसरे विकल्प का उपयोग करें। आप जानते हैं कि आप किस पैकेज को आयात करने का प्रयास कर रहे हैं (अंतिम उपाय के रूप में, इसे 'ImportError' संदेश से निकालें) और आप वर्तमान निर्देशिका नाम प्राप्त कर सकते हैं। जिस स्थिति को आप ढूंढ रहे हैं वह पैकेज और निर्देशिका नाम से मेल खाता है, नहीं? – isedev