2010-02-24 12 views
77

इस आयात त्रुटि को ठीक करने का सही तरीका क्या है?पायथन में "आयात त्रुटि: कोई मॉड्यूल नामित नहीं ..." त्रुटि कैसे ठीक करें?

मैं निम्नलिखित निर्देशिका संरचना है:

/home/bodacydo 
/home/bodacydo/work 
/home/bodacydo/work/project 
/home/bodacydo/work/project/programs 
/home/bodacydo/work/project/foo 

और मैं अगर मैं टाइप

python ./programs/my_python_program.py 

मैं तुरन्त प्राप्त निर्देशिका में हूँ

/home/bodacydo/work/project 

अब

ImportError: No module named foo.tasks 
- यह नहीं है

from foo.tasks import my_function 

मैं नहीं समझ सकता क्यों अजगर ./foo/tasks.py नहीं मिलेगा:

./programs/my_python_program.py निम्न पंक्ति में शामिल है।

अगर मैं अजगर खोल से यह करना है, तो यह काम करता है:

python 
>>> from foo.tasks import my_function 

यह केवल अगर मैं इसे python ./programs/my_python_program.py स्क्रिप्ट के माध्यम से फोन काम नहीं करता।

उत्तर

81

अजगर sys.path को वर्तमान निर्देशिका में शामिल नहीं होते, बल्कि निर्देशिका है कि स्क्रिप्ट में है। या तो sys.path या $PYTHONPATH को /home/bodacydo/work/project जोड़ें।

+1

तो क्या तब रूट फ़ोल्डर में __init__.py होने की बात? ऐसा लगता है कि यदि आप sys.path या पायथनपैथ को संपादित करते हैं तो ऐसा कोई उद्देश्य नहीं है। –

+7

@Editor:। '__init __ py' केवल इंगित करता है कि निर्देशिका एक पैकेज है, जब अपनी मूल या तो' sys.path' में है या अपने आप में एक पैकेज के रूप में व्यवहार किया जाना चाहिए। –

+1

इसके अतिरिक्त फ़ोल्डर पर अनुमतियों की जांच करें। यह मेरे मामले में समस्या थी। – SidJ

31

क्या आपके पास foo निर्देशिका में __init__.py नाम की एक फ़ाइल है? यदि नहीं तो पायथन एक पायथन पैकेज के रूप में foo पहचान नहीं होगा।

अधिक जानकारी के लिए पाइथन ट्यूटोरियल में section on packages देखें।

+0

धन्यवाद और हाँ, मैं '__init था __। py'। इस बार समस्या $ PYTHONPATH 'थी। इग्नासिओ का समाधान काम किया। – bodacydo

+1

__init__.py फ़ाइलों को पाइथन को निर्देशिका वाले संकुल के रूप में बनाने के लिए आवश्यक है; मॉड्यूल खोज पथ पर बाद में होने वाले मान्य मॉड्यूल को अनजाने में छिपाने से, स्ट्रिंग जैसे सामान्य नाम वाले निर्देशिकाओं को रोकने के लिए यह किया जाता है। सबसे सरल मामले में, __init__.py बस एक खाली फ़ाइल हो सकती है – panofish

+0

मुझे कुछ समय बचाने के लिए धन्यवाद। –

2

मेरे दिमाग में मुझे यह मानना ​​है कि foo फ़ोल्डर एक स्टैंड-अलोन लाइब्रेरी है। मैं इसे एक पायथन स्थापना के भीतर Lib\site-packages फ़ोल्डर में ले जाने पर विचार करना चाहूंगा। मैं वहां foo.pth फ़ाइल जोड़ने पर विचार करना चाहूंगा।

मैं जानता हूँ कि यह एक पुस्तकालय है, क्योंकि ./programs/my_python_program.py निम्न पंक्ति में शामिल हैं:

from foo.tasks import my_function

तो यह कोई फर्क नहीं पड़ता कि ./programs./foo को एक भाई फ़ोल्डर है।

python ./programs/my_python_program.py

7

यहाँ है एक कदम दर कदम समाधान:

  1. /home/bodacydo/work/project में एक स्क्रिप्ट run.py बुलाया जोड़ें और इस तरह इसे संपादित यह तथ्य यह है कि my_python_program.py इस तरह एक स्क्रिप्ट के रूप में चलाया जाता है है:

    import programs.my_python_program 
    programs.my_python_program.main() 
    
    my_python_program में अपने समकक्ष विधि के साथ

    (की जगह main()।)

  2. जाओ /home/bodacydo/work/project को
  3. भागो run.py

स्पष्टीकरण: के बाद से अजगर स्क्रिप्ट जिसमें से यह चलाता है, run.py चल /home/bodacydo/work/project संलग्न कर देगा के रास्ते PYTHONPATH को संलग्न कर देता है । और देखा, import foo.tasks मिल जाएगा। अपने PYTHONPATH के पुस्तकालय को जोड़ने के लिए

7

उदाहरण समाधान।

export PYTHONPATH="$PYTHONPATH:$HOME/.python" 
  • फिर अपने ~/.python फ़ोल्डर में अपने आवश्यक पुस्तकालय लिंक, उदहारण के लिए:

    1. अपने ~/.bashrc या तो बस उसे सीधे चलाने में निम्नलिखित पंक्ति जोड़ दें

      ln -s /home/user/work/project/foo ~/.python/ 
      
  • 0

    PYTHONPATH की स्थापना की तुलना में एक बेहतर ठीक python -m module.path

    यह सही ढंग से sys.path[0] सेट और मॉड्यूल निष्पादित करने के लिए एक और अधिक विश्वसनीय तरीका है जाएगा उपयोग करने के लिए है।

    मैं के लिए इस python path/to/file.pyPYTHONPATH (sys.path) की शुरुआत पर path/to डालता है के रूप में अन्य answerers कारण का उल्लेख किया है, इस समस्या के बारे में quick writeup है।

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