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


115

इस आयात त्रुटि को ठीक करने का सही तरीका क्या है?

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

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

और मैं डायरेक्टरी में हूं

/home/bodacydo/work/project

अब अगर मैं टाइप करता हूँ

python ./programs/my_python_program.py

मैं तुरन्त मिलता हूं

ImportError: No module named foo.tasks

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

from foo.tasks import my_function

मुझे समझ नहीं आ रहा है कि अजगर क्यों नहीं मिलेगा ./foo/tasks.py- यह वहाँ है।

अगर मैं इसे पायथन शेल से करता हूं, तो यह काम करता है:

python
>>> from foo.tasks import my_function

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

जवाबों:


121

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


9
तो रूट फ़ोल्डर में init .py होने के बिंदु क्या है ? यदि आप sys.path या pythonpath को संपादित करते हैं, तो इसका कोई उद्देश्य नहीं है।

11
@ एडिटर: __init__.pyकेवल यह इंगित करता है कि निर्देशिका को एक पैकेज के रूप में माना जाना चाहिए, जब इसका अभिभावक या तो sys.pathस्वयं एक पैकेज है।
— इग्नासियो वाज़क्वेज़-अब्राम्स

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

15
अजगर मार्ग में वर्तमान डायर को जोड़ने के लिए, उपयोग करेंexport PYTHONPATH=`pwd`
— कृन्गोरास

1
मेरे लिए काम करने के लिए $ PYTHONPATH को प्रोजेक्ट की मूल निर्देशिका में जोड़ना था, आपके मामले में यह होगा: /home/bodacydo/work... इस उत्तर को देखें
— maledr53

33

क्या आपके पास __init__.pyfoo डायरेक्टरी में एक फाइल है ? यदि नहीं, तो अजगर एक अजगर पैकेज के रूप में फू को नहीं पहचान सकेगा।

अधिक जानकारी के लिए अजगर ट्यूटोरियल में संकुल पर अनुभाग देखें ।


धन्यवाद और हाँ, मेरे पास था __init__.py। इस समय समस्या यह थी $PYTHONPATH। इग्नासियो के समाधान ने काम किया।
— बोडैसिडो

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

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

9

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

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

    import programs.my_python_program
    programs.my_python_program.main()

    ( main()अपनी समकक्ष पद्धति से प्रतिस्थापित करें my_python_program)

  2. के लिए जाओ /home/bodacydo/work/project
  3. Daud run.py

स्पष्टीकरण: के बाद से अजगर PYTHONPATH करने के रास्ते भी संलग्न करती स्क्रिप्ट जहाँ से इसे चलाता , चल run.pyसंलग्न कर देगा /home/bodacydo/work/project। और voilà , मिल import foo.tasksजाएगा।


8

अपने PYTHONPATH में पुस्तकालय जोड़ने के लिए उदाहरण समाधान।

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

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. फिर अपने आवश्यक पुस्तकालय को अपने ~ / .python फ़ोल्डर में लिंक करें, जैसे

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

6

एक बेहतर सेटिंग से ठीक PYTHONPATHउपयोग करने के लिए हैpython -m module.path

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

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


2

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

मुझे पता है कि यह एक पुस्तकालय है क्योंकि ./programs/my_python_program.pyइसमें निम्नलिखित पंक्ति है:

from foo.tasks import my_function

तो इससे कोई फर्क नहीं पड़ता कि ./programsयह एक भाई के लिए फ़ोल्डर है ./foo। यह my_python_program.pyइस तरह से एक स्क्रिप्ट के रूप में चलाया जाता है:

python ./programs/my_python_program.py


0

यदि आपको इंस्टाल्ड संस्करण का उपयोग करते समय यह समस्या है, तो उपयोग करते समय setup.py, सुनिश्चित करें कि आपका मॉड्यूल अंदर शामिल हैpackages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.