অ্যাট্রিবিউটআরার: 'মডিউল' অবজেক্টটির কোনও বৈশিষ্ট্য নেই


193

আমার দুটি পাইথন মডিউল রয়েছে:

a.py

import b

def hello():
  print "hello"

print "a.py"
print hello()
print b.hi()

b.py

import a

def hi():
  print "hi"

আমি যখন দৌড়ে যাই a.py, তখন আমি পাই:

AttributeError: 'module' object has no attribute 'hi'

ত্রুটির অর্থ কী? আমি কীভাবে এটি ঠিক করব?


মনে রাখবেন যে আপনার প্রশ্নগুলি এই উত্তরের সাথে খুব মিল। স্পষ্টতই এই উত্তরের কোডটি কেবল সন্ধান করতে কাজ করে, তবে আপনার কি তা নয়? stackoverflow.com/a/7336880/565879
Buttons840

উত্তর:


188

আপনার পারস্পরিক শীর্ষ স্তরের আমদানি রয়েছে যা প্রায়শই একটি খারাপ ধারণা।

পাইথনে আপনার যদি সত্যিই পারস্পরিক আমদানি থাকতে হয় তবে তা করার উপায় হ'ল কোনও ফাংশনের মধ্যে সেগুলি আমদানি করা:

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()

এখন a.py সমস্যা তৈরি না করে নিরাপদে করতে পারে import b

(প্রথম নজরে এটি প্রদর্শিত হতে পারে যে cause_a_to_do_something()এটি অত্যন্ত অকার্যকর হবে কারণ এটি importআপনি যখন একবার কল করবেন তখনই এটি ঘটায় তবে বাস্তবে আমদানি কাজটি প্রথমবারেই হয়ে যায় The দ্বিতীয় এবং পরবর্তী সময়ে আপনি কোনও মডিউল আমদানি করেন এটি একটি দ্রুত অপারেশন। )


92

আমি অজান্তে স্ট্যান্ডার্ড পাইথন মডিউলগুলির একটি হিসাবে একই নামে একটি মডিউল নামকরণ করার সময়ও এই ত্রুটিটি দেখেছি। উদাহরণস্বরূপ আমার একটি মডিউল নামে পরিচিত commandsযা একটি পাইথন লাইব্রেরি মডিউলও। এটি আমার স্থানীয় বিকাশের পরিবেশে সঠিকভাবে কাজ করে তবে এটি গুগল অ্যাপ ইঞ্জিনে চলাকালীন নির্দিষ্ট ত্রুটিটি সহ ব্যর্থ হয়েছিল তা ট্র্যাক করা কঠিন বলে প্রমাণিত।


42

সমস্যাটি হল মডিউলগুলির মধ্যে বিজ্ঞপ্তি নির্ভরতা। aআমদানি bএবং bআমদানি a। তবে এর মধ্যে একটির প্রথমে লোড করা দরকার - এই ক্ষেত্রে অজগরটি মডিউলটি আরম্ভ aকরার আগে শেষ হয়ে যায় bএবং b.hi()আপনি যখন এটি অ্যাক্সেস করার চেষ্টা করেন তখন এখনও উপস্থিত না a


21

এই এনামটি উল্লেখ করে এই ত্রুটিটি পেয়েছি যা ভুল উপায়ে আমদানি করা হয়েছিল, যেমন:

from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member

সঠিক আমদানি:

from package.MyEnumClass import MyEnumClass

আশা করি যে কাউকে সাহায্য করবে


7

আমি এই ত্রুটিটি অনুভব করেছি কারণ মডিউলটি আসলে আমদানি করা হয়নি। কোডটি এরকম দেখাচ্ছে:

import a.b, a.c

# ...

something(a.b)
something(a.c)
something(a.d)  # My addition, which failed.

শেষ লাইনের ফলস্বরূপ একটি AttributeError। কারণটি হ'ল আমি লক্ষ্য করতে ব্যর্থ হয়েছি যে a( a.bএবং a.c) এর সাবমডিউলগুলি সুস্পষ্টভাবে আমদানি করা হয়েছিল, এবং ধরে নিয়েছিল যে importবিবৃতিটি আসলে আমদানি করেছে a


6

আমি একই সমস্যা সম্মুখীন। ব্যবহার করে স্থির reload

import the_module_name
from importlib import reload
reload(the_module_name)

5

আমি যখন গিট থেকে কোনও সংগ্রহস্থলের পুরানো সংস্করণটি পরীক্ষা করেছিলাম তখন আমি এই সমস্যায় পড়েছিলাম। গিট আমার .pyফাইলগুলিকে প্রতিস্থাপন করেছে , তবে তালিকাসিত .pycফাইলগুলি রেখে গেছে । যেহেতু .pyফাইল এবং .pycফাইলগুলি সিঙ্কের বাইরে ছিল, importএকটি .pyফাইলের কমান্ড .pycফাইলগুলিতে সংশ্লিষ্ট মডিউলটি খুঁজে পেল না ।

সমাধানটি ছিল কেবল .pycফাইলগুলি মুছতে এবং সেগুলিকে স্বয়ংক্রিয়ভাবে পুনরায় জেনারেট করা let


আপনি সমস্ত .pycফাইল মুছতে এই আদেশটি ব্যবহার করতে পারেন :find . -name "*.pyc" -exec rm -f {} \;
অলি

4

উপর উবুন্টু 18.04 ( virtualenv , python.3.6.x ), নিম্নলিখিত রিলোড স্নিপেট মীমাংসিত আমার জন্য সমস্যা:

main.py

import my_module  # my_module.py
from importlib import reload # reload 
reload(my_module)

print(my_module)
print(my_modeule.hello())

কোথায়:

|--main.py    
|--my_module.py

আরও ডকুমেন্টেশন চেক জন্য: এখানে


3

উপরের সমস্ত উত্তর দুর্দান্ত, তবে আমি এখানে চিমাইতে চাই। যদি আপনি উপরে উল্লিখিত কোনও সমস্যা চিহ্নিত না করে থাকেন তবে আপনার কাজের পরিবেশ পরিষ্কার করার চেষ্টা করুন। এটা আমার জন্য কাজ করেছে।


0

নিশ্চিত না কীভাবে তবে নীচের পরিবর্তনগুলি আমার সমস্যার সমাধান করেছে:

আমার ফাইলের নাম এবং আমদানির নাম একই ছিল যেমন আমার ইমোজি.পি হিসাবে ফাইলের নাম ছিল এবং আমি ইমোজি আমদানি করার চেষ্টা করছিলাম। তবে ফাইলের নাম পরিবর্তন করে সমস্যার সমাধান হয়েছে।

আশা করি এটি সাহায্য করে


0

বিজ্ঞপ্তি আমদানিতে সমস্যা দেখা দেয় তবে পাইথনের অন্তর্নির্মিত প্রশমিত করার উপায় রয়েছে।

সমস্যাটি যখন আপনি চালনা করেন python a.pyএটি চালায় a.pyতবে এটি মডিউল হিসাবে আমদানি করে চিহ্নিত করে না। সুতরাং পরিবর্তে a.py-> আমদানি মডিউল খ -> আমদানি মডিউল একটি -> আমদানি মডিউল খ। খ বর্তমানে আমদানি করা হবার পরে সর্বশেষ আমদানি করা একটি অপ-অপশন এবং পাইথন তার বিরুদ্ধে রক্ষা করে। এবং বি আপাতত একটি খালি মডিউল। সুতরাং যখন এটি কার্যকর করে b.hi(), এটি কিছুই খুঁজে পায় না।

নোট করুন যে b.hi()কার্যকর করা হয়েছে তা হল a.py-> মডিউল বি -> মডিউল এ, a.pyসরাসরি হয় না ।

আপনার নির্দিষ্ট উদাহরণে, আপনি কেবল python -c 'import a'শীর্ষ-স্তরে চলতে পারেন , সুতরাং এর প্রথম সম্পাদনটি a.pyমডিউল আমদানি হিসাবে নিবন্ধিত হয়।


0

অর্ডার আমদানি কারণে কেন আমি সমস্যা হচ্ছে ছিল:

a.py:

############
# this is a problem
# move this to below
#############
from b import NewThing

class ProblemThing(object):
    pass

class A(object):
   ###############
   # add it here
   # from b import NewThing
   ###############
   nt = NewThing()
   pass

b.py:

from a import ProblemThing

class NewThing(ProblemThing):
    pass

রিচিহিন্ডির জবাবের মতো, তবে ক্লাসগুলির সাথে এটি কীভাবে দেখাতে পারে তার অন্য একটি উদাহরণ।


0

আমি এই সমস্যাটি দিয়ে বহুবার পেরিয়েছি, তবে আমি এটি সম্পর্কে আরও গভীরভাবে খোঁজ করার চেষ্টা করিনি। এখন আমি মূল বিষয়টি বুঝতে পারি।

এবার আমার সমস্যাটি বিভিন্ন মডিউল যেমন: নীচের মতো সিরিয়ালাইজার (জ্যাঙ্গো এবং পুনরায় ফ্রেমওয়ার্ক) আমদানি করছিল:

from rest_framework import serializers

from common import serializers as srlz
from prices import models as mdlpri

# the line below was the problem 'srlzprod'
from products import serializers as srlzprod

আমি এই জাতীয় সমস্যা হচ্ছিলাম:

from product import serializers as srlzprod
ModuleNotFoundError: No module named 'product'

আমি যা অর্জন করতে চেয়েছিলাম তা হ'ল:

class CampaignsProductsSerializers(srlz.DynamicFieldsModelSerializer):
    bank_name = serializers.CharField(trim_whitespace=True,)
    coupon_type = serializers.SerializerMethodField()
    promotion_description = serializers.SerializerMethodField()

    # the nested relation of the line below
    product = srlzprod.ProductsSerializers(fields=['id','name',],read_only=True,)

সুতরাং, কীভাবে এটি সমাধান করবেন (শীর্ষ-স্তরের আমদানি) উপরে লাইনগুলি দ্বারা উল্লিখিত হয়েছে, আমি নিম্নলিখিত পরিবর্তনগুলি করতে এগিয়ে চলেছি:

# change
product = srlzprod.ProductsSerializers(fields=['id','name',],read_only=True,)
# by 
product = serializers.SerializerMethodField()

# and create the following method and call from there the required serializer class
def get_product(self, obj):
        from products import serializers as srlzprod
        p_fields = ['id', 'name', ]
        return srlzprod.ProductsSerializers(
            obj.product, fields=p_fields, many=False,
        ).data

অতএব, জ্যাঙ্গো রানসরভার সমস্যা ছাড়াই কার্যকর করা হয়েছিল:

./project/settings/manage.py runserver 0:8002 --settings=settings_development_mlazo
Performing system checks...

System check identified no issues (0 silenced).
April 25, 2020 - 13:31:56
Django version 2.0.7, using settings 'settings_development_mlazo'
Starting development server at http://0:8002/
Quit the server with CONTROL-C.

কোড লাইনের চূড়ান্ত অবস্থাটি ছিল:

from rest_framework import serializers

from common import serializers as srlz
from prices import models as mdlpri

class CampaignsProductsSerializers(srlz.DynamicFieldsModelSerializer):
    bank_name = serializers.CharField(trim_whitespace=True,)
    coupon_type = serializers.SerializerMethodField()
    promotion_description = serializers.SerializerMethodField()
    product = serializers.SerializerMethodField()

    class Meta:
        model = mdlpri.CampaignsProducts
        fields = '__all__'

    def get_product(self, obj):
        from products import serializers as srlzprod
        p_fields = ['id', 'name', ]
        return srlzprod.ProductsSerializers(
            obj.product, fields=p_fields, many=False,
        ).data

আশা করি এটি অন্য সবার জন্য সহায়ক হতে পারে।

গ্রিটিংস,


0

আমার ক্ষেত্রে পাইপথন ২. with এর সাথে নপি সংস্করণ ১.১৫.০. এর সাথে কাজ করে, এটি কাজ করে

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