सापेक्ष आयात - ModuleNotFoundError: x नाम का कोई मॉड्यूल नहीं


178

यह पहली बार है जब मैंने सचमुच बैठकर अजगर 3 की कोशिश की है, और लगता है कि बुरी तरह से विफल हो रहा है। मेरे पास निम्नलिखित दो फाइलें हैं:

  1. test.py
  2. config.py

config.py में कुछ फ़ंक्शन हैं और साथ ही कुछ वैरिएबल भी हैं। मैंने इसे निम्न में से हटा दिया है:

config.py

debug = True

test.py

import config
print (config.debug)

मैंने भी ए __init__.py

हालाँकि, मुझे निम्न त्रुटि मिल रही है:

ModuleNotFoundError: No module named 'config'

मुझे पता है कि py3 सम्मेलन पूर्ण आयात का उपयोग करना है:

from . import config

हालाँकि, यह निम्न त्रुटि की ओर जाता है:

ImportError: cannot import name 'config'

तो मैं यहाँ क्या करना है के रूप में एक नुकसान में हूँ ... किसी भी मदद की बहुत सराहना की है। :)


मैं त्रुटि को पुन: उत्पन्न नहीं कर सकता, आप इस कोड को कैसे निष्पादित करते हैं?
कॉपरफील्ड

2
मैं इसे बेकार के साथ निष्पादित करता हूं जो अजगर के साथ आते हैं, और भी python test.py, और यह पूरी तरह से ठीक काम करता है। मेरे पास pyCharm नहीं है, लेकिन शायद pyCharm का कुछ बुरा विन्यास समस्या पैदा कर रहा है
कॉपरफील्ड

1
बहुत अजीब। मैं WinPython का उपयोग कर रहा हूं - बस python.org से वैनिला पायथन 3.6 डाउनलोड करें, और यह ठीक काम करता है। कभी दुभाषिए की जाँच करने के लिए नहीं सोचा! धन्यवाद!
ब्लिट्जमैन

1
मेरा अनुमान है कि PYTHONPATH के साथ कुछ फंकी चल रहा है। अपनी आईडीई सेटिंग्स और / या सिस्टम वातावरण चर की जाँच करें।
मार्टिन टूरनोइज

1
मुझे भी यही सटीक समस्या है। यह pycharm नहीं है! यह python3 है। यह python2 में काम करता है, लेकिन python3 का उपयोग करते समय, आपको यह त्रुटि दिखाई देती है! अधिक निराश।

जवाबों:


163

TL; DR: मॉड्यूल द्वारा निष्पादित फ़ाइल से आप सापेक्ष आयात नहीं कर सकते क्योंकि __main__मॉड्यूल पैकेज का हिस्सा नहीं है।

पूर्ण आयात - पर उपलब्ध कुछ आयात करेंsys.path

सापेक्ष आयात - वर्तमान मॉड्यूल के सापेक्ष कुछ आयात करते हैं, एक पैकेज का एक हिस्सा होना चाहिए

यदि आप दोनों वेरिएंट बिल्कुल उसी तरह से चला रहे हैं, तो उनमें से एक को काम करना चाहिए। वैसे भी, एक उदाहरण यह है कि आपको यह समझने में मदद करनी चाहिए कि क्या हो रहा है, आइए main.pyइस तरह की समग्र निर्देशिका संरचना के साथ एक और फ़ाइल जोड़ें :

.
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py

और देखते हैं कि क्या हो रहा है, यह देखने के लिए test.py अपडेट करें:

# config.py
debug = True


# test.py
print(__name__)

try:
    # Trying to find module in the parent package
    from . import config
    print(config.debug)
    del config
except ImportError:
    print('Relative import failed')

try:
    # Trying to find module on sys.path
    import config
    print(config.debug)
except ModuleNotFoundError:
    print('Absolute import failed')
# main.py
import ryan.test

आइए पहले test.py चलाएँ:

$ python ryan/test.py
__main__
Relative import failed
True

यहाँ "परीक्षण" है__main__ मॉड्यूल और एक पैकेज से संबंधित बारे में कुछ पता नहीं है। हालाँकि import config, काम करना चाहिए, क्योंकि ryanफ़ोल्डर को sys.path में जोड़ा जाएगा।

चलिए इसके बजाय main.py चलाते हैं:

$ python main.py
ryan.test
True
Absolute import failed

और यहां परीक्षण "रियान" पैकेज के अंदर है और रिश्तेदार आयात कर सकते हैं। import configविफल होने के बाद से पायथन 3 में निहित आयात को अनुमति नहीं है।

आशा है कि इससे मदद मिली।

पुनश्च: यदि आप पायथन 3 के साथ चिपके हुए हैं, तो __init__.pyफ़ाइलों की अधिक आवश्यकता नहीं है ।


3
क्या कुछ ऐसा है जिसे मैं हमेशा आयात करने के लिए कर सकता हूं? जैसे, sys.path.append('/some/path/my_module')अंदर बुलाओ /some/path/my_module/__init__.py?
जेम्स टी।

4
@JamesT। हां, sys.pathरनटाइम ( github.com/… ) के दौरान संशोधित करना बहुत आम है । आप PYTHONPATH पर्यावरण चर भी सेट कर सकते हैं।
इगनाटो डिस

6
"यदि आप पायथन 3 के साथ चिपके हुए हैं, तो __init__.pyफ़ाइलों की अधिक आवश्यकता नहीं है ।" दिलचस्प। क्या आप इसे विस्तार से बताएंगे? मैं इस धारणा के तहत था कि पैकेज रिज़ॉल्यूशन मेकेनिज़्म ने 2 और 3 के बीच इतना कुछ नहीं बदला है
केविन

2
"यदि आप पायथन 3 के साथ चिपके हुए हैं तो __init__.pyफाइलों की अधिक आवश्यकता नहीं है ।" इसके विपरीत, क्या आप चीजों का वर्णन कर सकते हैं यदि हम पैकेज को 2 और 3 दोनों में काम करना चाहते हैं? और 2009 की तारीख से बाहर देखो क्या है __init__.py? और इसका सबसे उच्च-उत्तर दिया गया उत्तर "यह एक पैकेज का एक हिस्सा है" । हमें हर जगह और अक्सर "नियमित पैकेज [पुराना, प्री-3.3]" बनाम "नामस्थान पैकेज [3.3+]" पर जोर देना शुरू करना होगा ।
एसएमसीआई

61

मैं यह समझ गया। बहुत निराशा होती है, खासकर python2 से।

आपको .मॉड्यूल से जोड़ना होगा , भले ही यह सापेक्ष या निरपेक्ष हो या न हो।

मैंने निम्नानुसार डायरेक्टरी सेटअप बनाया।

/main.py
--/lib
  --/__init__.py
  --/mody.py
  --/modx.py

modx.py

def does_something():
    return "I gave you this string."

mody.py

from modx import does_something

def loaded():
    string = does_something()
    print(string)

main.py

from lib import mody

mody.loaded()

जब मैं मुख्य निष्पादित करता हूं, तो यही होता है

$ python main.py
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    from lib import mody
  File "/mnt/c/Users/Austin/Dropbox/Source/Python/virtualenviron/mock/package/lib/mody.py", line 1, in <module>
    from modx import does_something
ImportError: No module named 'modx'

मैं 2to3 भागा, और मुख्य आउटपुट यह था

RefactoringTool: Refactored lib/mody.py
--- lib/mody.py (original)
+++ lib/mody.py (refactored)
@@ -1,4 +1,4 @@
-from modx import does_something
+from .modx import does_something

 def loaded():
     string = does_something()
RefactoringTool: Files that need to be modified:
RefactoringTool: lib/modx.py
RefactoringTool: lib/mody.py

मुझे इसे ठीक करने के लिए mody.py के आयात विवरण को संशोधित करना पड़ा

try:
    from modx import does_something
except ImportError:
    from .modx import does_something


def loaded():
    string = does_something()
    print(string)

फिर मैंने फिर से मेनडोमेन चलाया और अपेक्षित आउटपुट मिला

$ python main.py
I gave you this string.

अंत में, बस इसे साफ करने और इसे 2 और 3 के बीच पोर्टेबल बनाने के लिए।

from __future__ import absolute_import
from .modx import does_something

1
टिप्पण लायक है कि try/exceptलोडिंग प्रक्रिया वास्तविक घटक है कि यहां काम करता है (जैसा कि कुछ लोगों का उपयोग करने की आवश्यकता होगी है try:scripts.modxऔर except: modx), और क्या मेरे लिए यह समस्या हल हो जाती थी।
जस्टापीजन

40

PYTHONPATH को सेट करना भी इस समस्या में मदद कर सकता है।

यहां बताया गया है कि यह विंडोज पर कैसे किया जा सकता है

set PYTHONPATH=.


11
PYTHONPATH को मुख्य कोड निर्देशिका में सेट करने से मेरे लिए समस्या हल हो गई!
गीक

1
लिनक्स में भी काम करता है। निर्यात PYTHONPATH =।
rjdkolb

29

आपको मॉड्यूल के पथ को जोड़ना होगा PYTHONPATH


UNIX (Linux, OSX, ...) के लिए

export PYTHONPATH="${PYTHONPATH}:/path/to/your/module/"

विंडोज के लिए

set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\module\

4
बहुत धन्यवाद @Giorgos! यह विशेष रूप से सच है जब आप एक डॉकटर छवि में रूट डायरेक्टरी सेट करने का प्रयास कर रहे हैं।
टोनी फ्रेजर

15

अपना उदाहरण दिया

from . import config

निम्नलिखित SystemError मिला:
/usr/bin/python3.4 test.py Traceback
(सबसे हालिया कॉल अंतिम):
फ़ाइल "test.py", पंक्ति 1,
से। आयात विन्यास
SystemError: जनक मॉड्यूल 'लोड नहीं है, सापेक्ष आयात नहीं कर सकता है


यह मेरे लिए काम करेगा:

import config
print('debug=%s'%config.debug)

>>>debug=True

पायथन के साथ परीक्षण किया गया: 3.4.2 - PyCharm 2016.3.2


इसके अलावा PyCharm आपको यह नाम आयात करने की पेशकश करता है ।
आप पर क्लिक करने के लिए हवलदार configऔर एक मदद आइकन प्रकट होता है। यहां छवि विवरण दर्ज करें


11

आप बस अपने परीक्षण निर्देशिका में निम्नलिखित फ़ाइल जोड़ सकते हैं, और फिर अजगर परीक्षण से पहले इसे चलाएंगे

__init__.py file

import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

यह वही है जिसकी मैं तलाश कर रहा था। इस जवाब को साझा करने के लिए धन्यवाद !!!
मयूर

कुछ इस तरह से करने से लिंटर (pylint3) त्रुटि मिलती है। त्रुटि इस के समान है। filename.py:12 like: C0413: Import "import abc.def.ghi.file_util as file_util" मॉड्यूल के शीर्ष पर रखा जाना चाहिए (गलत-आयात-स्थिति)
शरद

6

PYTHONPATHरूट प्रोजेक्ट डायरेक्टरी में पर्यावरण चर सेट करें ।

UNIX को ध्यान में रखते हुए:

export PYTHONPATH=.

4

यह उदाहरण पायथन 3.6 पर काम करता है।

मेरा सुझाव है कि Run -> Edit ConfigurationsPyCharm में जा रहा हूं, वहां कोई भी प्रविष्टियां हटा रहा हूं , और फिर से PyCharm के माध्यम से कोड चलाने की कोशिश कर रहा हूं।

यदि वह काम नहीं करता है, तो अपने प्रोजेक्ट इंटरप्रिटर (सेटिंग्स -> प्रोजेक्ट इंटरप्रेटर) की जांच करें और कॉन्फ़िगरेशन डिफॉल्ट (रन -> कॉन्फ़िगरेशन कॉन्फ़िगर करें ...) चलाएं।


4

मॉड्यूल को कॉल करने से पहले सही sys.path सूची को घोषित करें:

import os, sys

#'/home/user/example/parent/child'
current_path = os.path.abspath('.')

#'/home/user/example/parent'
parent_path = os.path.dirname(current_path)

sys.path.append(parent_path)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'child.settings')

1

जैसा कि मूल पोस्ट के लिए टिप्पणियों में कहा गया था, यह मुझे लगता है कि जो भी कारण के लिए उपयोग कर रहा था, अजगर के साथ एक मुद्दा था, और अजगर स्क्रिप्ट के साथ कुछ गलत नहीं था। मैं WinPython बंडल से आधिकारिक अजगर 3.6 python.org से बदल गया और यह ठीक काम किया। सहायता के लिए हर किसी को धन्यवाद :)


1
हम्म यह कहने से नफरत करते हैं लेकिन मेरे साथ भी वही हुआ। मनोरंजन का माहौल समस्या को ठीक करता है। मेरे मामले में, परीक्षण चलाते समय मुझे यह त्रुटि मिल रही थी। एक ही वातावरण में, एक ही मॉड्यूल को आयात करने के प्रयास ने काम किया। मनोरंजन के माहौल ने उन सभी को ठीक कर दिया (वही अजगर संस्करण 3.6)
नाको

1
अलग-अलग आईडीई के पास विशेष रूप से प्रोजेक्ट स्रोत फ़ाइलों (दृश्य, मॉड्यूल, टेम्प्लेट, आदि) के लिए पथ को संभालने का अलग तरीका है। यदि आपकी परियोजना को ठीक से संरचित और कोडित किया गया है, तो यह सभी (मानक) आईडीई के लिए काम करना चाहिए। WinPython की तरह लोकप्रिय IDE के साथ समस्या होने का मतलब है कि समस्या वास्तव में आपके प्रोजेक्ट से आ रही है। जैसा कि ऊपर उल्लेख किया गया है, उपयोगकर्ता 3159377 द्वारा "मॉड्यूल में आपको एक जोड़ना है" समस्या है जो स्वीकृत उत्तर होना चाहिए।
winux

1

यदि आप अजगर 3+ का उपयोग कर रहे हैं तो नीचे की पंक्तियों को जोड़ने का प्रयास करें

import os, sys
dir_path = os.path.dirname(os.path.realpath(__file__))
parent_dir_path = os.path.abspath(os.path.join(dir_path, os.pardir))
sys.path.insert(0, parent_dir_path)

0

प्रयत्न

from . import config

जो करता है वही फ़ोल्डर स्तर से आयात होता है। यदि आप सीधे आयात करने की कोशिश करते हैं तो यह माना जाता है कि यह एक अधीनस्थ है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.