আপেক্ষিক আমদানি - 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'

আমি অবগত যে পাই 3 কনভেনশনটি পরম আমদানি ব্যবহার করতে হবে:

from . import config

যাইহোক, এটি নিম্নলিখিত ত্রুটি বাড়ে:

ImportError: cannot import name 'config'

সুতরাং আমি এখানে কী করব সে সম্পর্কে আমি ক্ষতিগ্রস্থ হচ্ছি ... যে কোনও সাহায্যের প্রশংসা করা হয়। :)


আমি ত্রুটিটি পুনরুত্পাদন করতে পারি না, আপনি এই কোডটি কীভাবে কার্যকর করবেন?
কপারফিল্ড

2
আমি অজগর দিয়ে আসা অলস এবং এটি হিসাবে কার্যকর করি python test.pyএবং এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে। আমার পাইকার্ম নেই তবে সম্ভবত পাইকার্মের কিছু খারাপ কনফিগারেশন যা সমস্যার সৃষ্টি করছে
কপারফিল্ড

1
খুব অদ্ভুত. আমি উইনপাইথন ব্যবহার করছি - পাইথন.অর্গ থেকে ভ্যানিলা পাইথন ৩.6 ডাউনলোড করুন এবং এটি দুর্দান্ত কাজ করে। দোভাষীর চেক করার কথা ভাবেনি! ধন্যবাদ!
blitzmann

1
আমার অনুমান যে পাইথনপথের সাথে মজার কিছু চলছে। আপনার আইডিই সেটিংস এবং / অথবা সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল পরীক্ষা করে দেখুন।
মার্টিন টর্নোইজ

1
আমার ঠিক একই সমস্যা আছে। এটি পিচরম নয়! এটি অজগর 3। এটি পাইথন 2 এ কাজ করে তবে পাইথন 3 ব্যবহার করার সময় আপনি এই ত্রুটিটি দেখেন! খুবই হতাশাজনক.

উত্তর:


163

টিএল; ডিআর: আপনি যে ফাইলটি এক্সিকিউট করেন সেখান থেকে আপেক্ষিক আমদানি করতে পারবেন না যেহেতু __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

প্রথমে টেস্ট.পি চালানো যাক:

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

এখানে "টেস্ট" হয়__main__ মডিউল এবং একটি প্যাকেজ একাত্মতার সম্পর্কে কিছু জানে না। তবে import configকাজ করা উচিত, যেহেতু ryanফোল্ডারটি sys.path এ যুক্ত হবে।

পরিবর্তে মেইন.পি চালানো যাক:

$ 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/… ) সংশোধন করা বেশ সাধারণ । আপনি পাইথনপথ পরিবেশ পরিবর্তনশীলও সেট করতে পারেন।
ইগোনাতো

6
"আপনি যদি পাইথন 3 দিয়ে আটকে থাকেন তবে __init__.pyফাইলগুলিতে আর কোনও প্রয়োজন নেই ।" মজাদার. আপনি এই সম্পর্কে বিস্তারিত বলতে পারেন? আমি এই ছাপের মধ্যে ছিলাম যে প্যাকেজ রেজোলিউশন পদ্ধতি 2 থেকে 3 এর মধ্যে এত বেশি পরিবর্তন করে নি
কেভিন

2
"আপনি যদি পাইথন 3 দিয়ে আটকে থাকেন তবে __init__.pyফাইলগুলির আর দরকার নেই is " বিপরীতে, আমরা 2 এবং 3 উভয় ক্ষেত্রেই কোনও প্যাকেজ কাজ করতে চাইলে আপনি কি জিনিসগুলি বর্ণনা করতে পারবেন? এবং হতাশাজনকভাবে পুরানো ২০০৯ দেখুন কী __init__.pyজন্য? এবং এর সর্বাধিক উত্সাহিত উত্তর "এটি একটি প্যাকেজের একটি অংশ" । আমাদের সর্বত্র এবং প্রায়শই "নিয়মিত প্যাকেজ [পুরাতন, প্রাক -3.3]" বনাম "নামস্থান প্যাকেজ [3.3+]" পার্থক্যের উপর জোর দেওয়া দরকার ।
স্মি

61

আমি এটি বের করেছিলাম। খুব হতাশাজনক, বিশেষত পাইথন 2 থেকে আসা।

আপনাকে .মডিউলে একটি যুক্ত করতে হবে, তা আপেক্ষিক বা পরম হোক না কেন।

আমি ডিরেক্টরি সেটআপ নিম্নলিখিত হিসাবে তৈরি।

/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

পাইথনপথ সেট করাও এই সমস্যার সাথে সহায়তা করতে পারে।

উইন্ডোজে এটি কীভাবে করা যায় তা এখানে

set PYTHONPATH=.


11
প্রধান কোড ডিরেক্টরিতে পাইথনপথ সেট করা আমার জন্য সমস্যার সমাধান!
গিগ

1
লিনাক্সেও কাজ করে। পাইথনপথ = রফতানি করুন।
rjdkolb

29

আপনাকে মডিউলটির পথটি যুক্ত করতে হবে PYTHONPATH


ইউনিক্সের জন্য (লিনাক্স, ওএসএক্স, ...)

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

উইন্ডোজ জন্য

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

4
জিয়েরগোসকে প্রচুর ধন্যবাদ! এটি বিশেষত সত্য যখন আপনি ডকারের ছবিতে একটি রুট ডিরেক্টরি সেট করার চেষ্টা করছেন।
টনি ফ্রেজার 21 ই

15

আপনার উদাহরণ চেষ্টা

from . import config

নিম্নলিখিত সিস্টেমেরর পেয়েছে:
/usr/bin/python3.4 টেস্ট.পি
ট্রেসব্যাক ( সর্বশেষতম কলটি শেষ):
ফাইল "টেস্ট.পি", লাইন 1,
থেকে in আমদানি কনফিগারেশন
সিস্টেমেরর: অভিভাবক মডিউল '' লোড হয়নি, আপেক্ষিক আমদানি করতে পারে না


এটি আমার পক্ষে কাজ করবে:

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

>>>debug=True

পাইথন দিয়ে পরীক্ষিত: 3.4.2 - পাইচার্ম 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__), '..')))

এই আমি ঠিক খুঁজছিলাম ছিল। এই উত্তর ভাগ করে নেওয়ার জন্য ধন্যবাদ !!!
ময়ূর

এই জাতীয় কিছু করা একটি লাইনটার (পাইলিন্ট 3) ত্রুটি দেয়। ত্রুটিটি এইটির মতো। filename.py:12:0: C0413: "আমদানি" abc.def.ghi.file_util কে file_util হিসাবে "মডিউলটির শীর্ষে রাখা উচিত (ভুল-আমদানি-অবস্থান)
শারদ

6

PYTHONPATHরুট প্রকল্প ডিরেক্টরিতে পরিবেশের পরিবর্তনশীল সেট করুন ।

ইউনিক্স-এর মতো বিবেচনা করা:

export PYTHONPATH=.

4

এই উদাহরণটি পাইথন ৩.6-এ কাজ করে।

আমি Run -> Edit Configurationsপাইচার্মে যাবার পরামর্শ দিচ্ছি , সেখানে যে কোনও প্রবেশিকা মুছে ফেলতে হবে এবং আবার পাইচার্মের মাধ্যমে কোড চালানোর চেষ্টা করব।

যদি এটি কাজ না করে, আপনার প্রকল্প দোভাষী (সেটিংস -> প্রকল্প দোভাষী) পরীক্ষা করুন এবং কনফিগারেশন ডিফল্ট চালান (চালান -> কনফিগারেশন সম্পাদনা করুন ...)।


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

মূল পোস্টে মন্তব্যে যেমন বলা হয়েছিল, এটি পাইথন দোভাষীর যে কোনও কারণেই আমি ব্যবহার করছি এবং পাইথন স্ক্রিপ্টগুলির সাথে কিছু ভুল হয়নি বলে মনে হচ্ছে issue আমি উইন পাইথন বান্ডেল থেকে পাইথন.আর.আরজে অফিশিয়াল পাইথন ৩.6 এ স্যুইচ করেছি এবং এটি ঠিক কাজ করেছে। সাহায্যের জন্য সকলকে ধন্যবাদ :)


1
হুম এটা বলার জন্য ঘৃণা করি কিন্তু একই জিনিসটি আমার সাথে ঘটেছিল। পরিবেশ পুনরুদ্ধার সমস্যা সমাধান করুন। আমার ক্ষেত্রে, পরীক্ষা চালানোর সময় আমি এই ত্রুটিটি পেয়েছিলাম। একই পরিবেশে, একই মডিউলটি আমদানির চেষ্টা কাজ করেছে।
পুনরুদ্ধার

1
প্রকল্পের উত্স ফাইলগুলি (ভিউ, মডিউল, টেম্পলেট ইত্যাদির জন্য) বিভিন্ন আইডিইর পাথের পরিচালনা করার বিভিন্ন পদ্ধতি রয়েছে যদি আপনার প্রকল্পটি কাঠামোগতভাবে সঠিকভাবে কোডড করা থাকে তবে এটি সমস্ত (স্ট্যান্ডার্ড) আইডিইতে কাজ করা উচিত। উইনপাইথনের মতো জনপ্রিয় আইডিইর সাথে সমস্যা হ'ল সমস্যাটি আসলে আপনার প্রকল্প থেকে আসছে। উপরে উল্লিখিত হিসাবে, সমস্যাটি হল "আপনাকে মডিউলটিতে একটি যুক্ত করতে হবে" ব্যবহারকারীর দ্বারা3159377 যা গ্রহণযোগ্য উত্তর হওয়া উচিত।
উইনাক্স

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

যা করে তা হ'ল একই ফোল্ডার স্তর থেকে আমদানি। আপনি যদি সরাসরি এটি আমদানির চেষ্টা করেন তবে ধরে নিন এটি একটি অধস্তন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.