python - पायथन त्रुटि "आयात त्रुटि: कोई मॉड्यूल नाम नहीं"




importerror python-import (13)

पाइथन स्थानीय निर्देशिका में स्थापित है।

मेरी निर्देशिका पेड़ इस तरह दिखता है:

(local directory)/site-packages/toolkit/interface.py

मेरा कोड यहां है:

(local directory)/site-packages/toolkit/examples/mountain.py

उदाहरण चलाने के लिए, मैं python mountain.py लिखता हूं, और मेरे पास कोड में है:

from toolkit.interface import interface

और मुझे त्रुटि मिलती है:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

मैंने पहले ही sys.path की sys.path और वहां मेरे पास निर्देशिका /site-packages । इसके अलावा, मेरे पास __init__.py.bin को इंगित करने के लिए टूलकिट फ़ोल्डर में __init__.py.bin फ़ाइल है जो यह एक पैकेज है। मेरे पास उदाहरण निर्देशिका में __init__.py.bin भी है।

मुझे नहीं पता कि पायथन को sys.path में फ़ाइल क्यों नहीं मिल sys.path । कोई विचार? क्या यह अनुमति समस्या हो सकती है? क्या मुझे कुछ निष्पादन अनुमति की आवश्यकता है?


  1. आपके पास उसी निर्देशिका में फ़ाइल __ init__.py होना चाहिए जहां यह वह फ़ाइल है जिसे आप आयात कर रहे हैं।
  2. आप एक फ़ाइल को आयात करने का प्रयास नहीं कर सकते हैं जिसमें एक ही नाम है और PYTHONPATH पर कॉन्फ़िगर किए गए 2 फ़ोल्डर्स से फ़ाइल बनें।

उदाहरण: / आदि / पर्यावरण

PYTHONPATH = $ PYTHONPATH: / opt / फ़ोल्डर 1: / opt / folder2

/ Opt / फ़ोल्डर 1 / foo

/ Opt / folder2 / foo

और, यदि आप foo फ़ाइल आयात करने का प्रयास कर रहे हैं, तो पाइथन आपको नहीं पता कि आप कौन सी चाहते हैं।

foo आयात से ... >>> आयातक: foo नामक कोई मॉड्यूल नहीं


* निक्स पर, यह भी सुनिश्चित करें कि PYTHONPATH सही तरीके से कॉन्फ़िगर किया गया है, विशेष रूप से इसमें यह प्रारूप है:

 .:/usr/local/lib/python

(ध्यान दें .: शुरुआत में, ताकि यह वर्तमान निर्देशिका पर भी खोज सके।)

संस्करण के आधार पर यह अन्य स्थानों में भी हो सकता है:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

एक ही मुद्दे को पीड़ित करने के बाद मुझे पता चला कि मेरा संकल्प मेरी परियोजना से सभी pyc फाइलों को हटाना था, ऐसा लगता है कि इन कैश की गई फाइलें इस त्रुटि को किसी भी तरह से उत्पन्न कर रही थीं।

ऐसा करने का सबसे आसान तरीका यह है कि विंडोज एक्सप्लोरर में मेरे प्रोजेक्ट फ़ोल्डर में नेविगेट करना और *.pyc लिए खोज *.pyc , फिर सभी ( Ctrl + ) का चयन करना और उन्हें हटाना ( Ctrl + X ) था।

यह संभव है कि मैं विशिष्ट pyc फाइल को हटाकर अपने मुद्दों का समाधान कर सकता हूं लेकिन मैंने कभी कोशिश नहीं की


ऑरिप की पोस्ट पर आपकी टिप्पणियों के आधार पर, मुझे लगता है कि यह हुआ है:

  1. आपने विंडोज़ पर __init__.py संपादित किया है।
  2. विंडोज एडिटर ने कुछ गैर-प्रिंटिंग जोड़ा, शायद एक कैरिज-रिटर्न (विंडोज़ में एंड-ऑफ-लाइन सीआर / एलएफ है; यूनिक्स में यह केवल एलएफ है), या शायद सीटीआरएल-जेड (विंडोज़ एंड-ऑफ-फाइल)।
  3. आपने फ़ाइल को अपने यूनिक्स बॉक्स में कॉपी करने के लिए WinSCP का उपयोग किया था।
  4. विनएससीपी ने सोचा: "इसमें कुछ ऐसा है जो मूल पाठ नहीं है; मैं बाइनरी डेटा इंगित करने के लिए एक .bin एक्सटेंशन डालूंगा।"
  5. गायब __init__.py (जिसे अब __init__.py.bin कहा जाता है) का अर्थ है कि पाइथन टूलकिट को पैकेज के रूप में नहीं समझता है।
  6. आप उपयुक्त निर्देशिका में __init__.py बनाते हैं और सबकुछ काम करता है ...?

जब मैंने एलपीटीडब्ल्यू में यह अभ्यास किया तो मैं कुछ बहुत ही समान में भाग गया; मैं पाइथन को यह पहचानने के लिए कभी नहीं मिला कि मेरे पास उस निर्देशिका में फाइलें थीं जिन्हें मैं कॉल कर रहा था। लेकिन मैं इसे अंत में काम करने में सक्षम था। मैंने क्या किया, और मैं क्या सलाह देता हूं, यह कोशिश करना है:

(नोट: आपके प्रारंभिक पोस्ट से, मुझे लगता है कि आप एक * NIX- आधारित मशीन का उपयोग कर रहे हैं और कमांड लाइन से चीजें चला रहे हैं, इसलिए यह सलाह उसके अनुरूप है। चूंकि मैं उबंटू चलाता हूं, यही वह है जो मैंने किया)

1) निर्देशिका के ऊपर निर्देशिका में निर्देशिका (सीडी) बदलें जहां आपकी फाइलें हैं। इस मामले में, आप mountain.py फ़ाइल को चलाने की कोशिश कर रहे हैं, और toolkit.interface.py मॉड्यूल को कॉल करने का प्रयास कर रहे हैं, जो अलग निर्देशिका में हैं। इस मामले में, आप उस निर्देशिका में जाएंगे जिसमें उन दोनों फ़ाइलों के पथ शामिल हैं (या दूसरे शब्दों में, निकटतम निर्देशिका जो उन दोनों फ़ाइलों के पथ साझा करती हैं)। इस मामले में toolkit निर्देशिका है।

2) जब आप tookit निर्देशिका में होते हैं, तो अपनी कमांड लाइन पर कोड की इस पंक्ति को दर्ज करें:

export PYTHONPATH=.

यह आपके PYTHONPATH को "।" पर सेट करता है, जिसका मूल रूप से अर्थ है कि आपका PYTHONPATH अब उस निर्देशिका के भीतर किसी भी बुलाए गए फाइलों की तलाश करेगा, जिसमें आप वर्तमान में हैं, और बिंदु के लिए, उस निर्देशिका की उप-निर्देशिका शाखाओं में, जो आप हैं। इसलिए यह आपकी वर्तमान निर्देशिका में नहीं दिखता है, बल्कि आपकी निर्देशिका में मौजूद सभी निर्देशिकाओं में)।

3) ऊपर दिए गए चरण में अपना PYTHONPATH सेट करने के बाद, अपने मॉड्यूल को अपनी वर्तमान निर्देशिका ( toolkit निर्देशिका) से चलाएं। पाइथन अब आपके द्वारा निर्दिष्ट मॉड्यूल को ढूंढ और लोड करना चाहिए।

उम्मीद है की यह मदद करेगा। मैं खुद से बहुत निराश था।


मुझे एक ही त्रुटि थी। यह किसी व्यक्ति द्वारा मेरी लिपि के समान फ़ोल्डर में एक फ़ोल्डर बनाने के कारण हुआ था, जिसका नाम मॉड्यूल से विवादित था जिसे मैं कहीं और से आयात कर रहा था। बाहरी मॉड्यूल को आयात करने के बजाय, यह इस फ़ोल्डर के अंदर देखा गया जिसमें स्पष्ट रूप से अपेक्षित मॉड्यूल शामिल नहीं थे।


मेरी समस्या यह थी कि मैंने निर्देशिका को __init__.py फ़ाइल के साथ PYTHONPATH में जोड़ा, जब वास्तव में मुझे इसकी मूल निर्देशिका जोड़ने की आवश्यकता थी।


मेरे दो सेंट:

थूक:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

इसने मुझे नरक को भ्रमित कर दिया - बदसूरत syspath हैक्स का सुझाव देने वाले पदों और पदों के माध्यम से चला गया (जैसा कि आप देखते हैं कि मेरे __init__.py सब वहाँ थे)। अच्छी तरह से पता चला है कि गेम / oblivion.py और गेम / विस्मरण पाइथन भ्रमित कर रहा था जो बदले में "रिकॉर्ड ग्रुप नामक कोई मॉड्यूल" नहीं थकाता था। मुझे इस (समान नाम) व्यवहार को दस्तावेज करने वाले वर्कअराउंड और / या लिंक में दिलचस्पी होगी -> संपादित करें (2017.01.24) - क्या देखें यदि मेरे पास एक मॉड्यूल है और उसी नाम वाला पैकेज है? दिलचस्प बात यह है कि आम तौर पर पैकेज प्राथमिकता लेते हैं लेकिन स्पष्ट रूप से हमारे लॉन्चर इसका उल्लंघन करते हैं।

संपादित करें (2015.01.17): मैंने उल्लेख नहीं किया कि हम here विच्छेदित एक कस्टम लॉन्चर का उपयोग करते here


मैंने अपनी समस्या हल की, और मैं उन चीज़ों का सारांश लिखूंगा जो गलत थे और समाधान:

फ़ाइल को बिल्कुल __init__.py कहा जाना चाहिए। यदि एक्सटेंशन मेरे मामले में .py.bin तो पाइथन निर्देशिकाओं के माध्यम से नहीं जा सकता है और फिर यह मॉड्यूल नहीं ढूंढ सकता है। फ़ाइलों को संपादित करने के लिए आपको एक लिनक्स संपादक, जैसे vi या nano का उपयोग करने की आवश्यकता है। यदि आप एक विंडोज संपादक का उपयोग करते हैं तो यह कुछ छिपे हुए पात्रों को लिख देगा।

एक और समस्या जो इसे प्रभावित कर रही थी वह था कि मेरे पास रूट द्वारा स्थापित एक और पायथन संस्करण था, इसलिए यदि कोई पाइथन की स्थानीय स्थापना के साथ काम कर रहा है, तो सुनिश्चित करें कि प्रोग्राम चलाने वाले पायथन इंस्टॉलेशन स्थानीय पायथन है। इसे जांचने के लिए, बस which python , और देखें कि निष्पादन योग्य वह है जो आपकी स्थानीय निर्देशिका में है। यदि नहीं, तो पथ बदलें, लेकिन सुनिश्चित करें कि स्थानीय पायथन निर्देशिका अन्य पायथन से पहले है।


यदि आपने ऊपर प्रदान की गई सभी विधियों का प्रयास किया है लेकिन असफल रहा है, तो हो सकता है कि आपके मॉड्यूल में अंतर्निहित मॉड्यूल के समान नाम हो । या, उसी मॉड्यूल के साथ एक मॉड्यूल जो आपके मॉड्यूल की तुलना में sys.path में उच्च प्राथमिकता वाले फ़ोल्डर में sys.path है।

डीबग करने के लिए, from foo.bar import baz शिकायतों from foo.bar import baz ImportError: No module named barimport foo; print foo करने के लिए बदल रहा है import foo; print foo import foo; print foo , जो import foo; print foo का मार्ग दिखाएगा। क्या आप इसकी उम्मीद करते हैं?

यदि नहीं, तो या तो foo नाम बदलें या पूर्ण आयात का उपयोग करें।


हाँ। आपको __init__.py फ़ाइल रखने के लिए निर्देशिका की आवश्यकता है, जो फ़ाइल है जो पैकेज को प्रारंभ करता है। यहां, this

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


PyCharm (JetBrains सूट का हिस्सा) का उपयोग करके आपको अपनी स्क्रिप्ट निर्देशिका को स्रोत के रूप में परिभाषित करने की आवश्यकता है:
Right Click > Mark Directory as > Sources Root


python -m pip install <library-name> बजाय python -m pip install <library-name> का उपयोग कर मॉड्यूल को स्थापित करना एक आसान समाधान है pip install <library-name> आप व्यवस्थापक प्रतिबंधों के मामले में सुडो का उपयोग कर सकते हैं







python-import