गुण: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है


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
बटन 8

जवाबों:


188

आपके पास पारस्परिक शीर्ष-स्तरीय आयात हैं, जो लगभग हमेशा एक बुरा विचार है।

यदि आपके पास वास्तव में पायथन में आपसी आयात होना चाहिए, तो ऐसा करने का तरीका उन्हें एक समारोह में आयात करना है:

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

अब import bसमस्या उत्पन्न किए बिना ही a.py सुरक्षित रूप से कर सकता है।

(पहली नज़र में ऐसा प्रतीत हो सकता है कि cause_a_to_do_something()यह बेहद अक्षम होगा क्योंकि यह importहर बार जब आप इसे कॉल करते हैं, लेकिन वास्तव में आयात कार्य केवल पहली बार किया जाता है। दूसरा और बाद में जब आप मॉड्यूल आयात करते हैं, तो यह एक त्वरित ऑपरेशन है। )


92

मैंने यह त्रुटि भी देखी है जब अनजाने में मानक पायथन मॉड्यूल में से एक के समान नाम के साथ एक मॉड्यूल का नामकरण किया जाता है। उदाहरण के लिए मेरे पास एक मॉड्यूल था जिसे commandsपायथन लाइब्रेरी मॉड्यूल भी कहा जाता है। यह मेरे स्थानीय विकास के वातावरण पर सही ढंग से काम करने के साथ-साथ इसे ट्रैक करना मुश्किल साबित हुआ, लेकिन Google ऐप इंजन पर चलने के दौरान निर्दिष्ट त्रुटि के साथ विफल रहा।


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

मैं इस समस्या में भाग गया जब मैंने गिट से एक रिपॉजिटरी के पुराने संस्करण की जांच की। Git ने मेरी .pyफ़ाइलों को बदल दिया , लेकिन अनट्रैक की गई .pycफ़ाइलों को छोड़ दिया । चूंकि .pyफाइलें और .pycफाइलें सिंक से बाहर थीं, इसलिए importकिसी .pyफाइल में कमांड .pycफाइलों में संबंधित मॉड्यूल नहीं खोज सका ।

समाधान केवल .pycफ़ाइलों को हटाने के लिए था , और उन्हें स्वचालित रूप से पुनर्जीवित होने दें।


आप सभी .pycफ़ाइलों को हटाने के लिए इस कमांड का उपयोग कर सकते हैं :find . -name "*.pyc" -exec rm -f {} \;
Ollie

4

पर ubuntu 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

निश्चित नहीं है कि कैसे लेकिन नीचे के परिवर्तन ने मेरी समस्या को हल किया:

मैं फ़ाइल का नाम और आयात नाम एक ही रख रहा था, उदाहरण के लिए, मेरे पास फ़ाइल का नाम emoji.py था और मैं इमोजी आयात करने का प्रयास कर रहा था। लेकिन फ़ाइल का नाम बदलने से समस्या हल हो गई।

आशा है कि यह मदद करता है


0

परिपत्र आयात समस्याओं का कारण बनता है, लेकिन पायथन के पास इसे कम करने के तरीके हैं।

समस्या यह है कि जब आप दौड़ते हैं python a.py, तो यह चलता है a.pyलेकिन इसे मॉड्यूल के रूप में आयात नहीं किया जाता है। तो बदले में a.py-> आयात मॉड्यूल b -> आयात मॉड्यूल a -> आयात मॉड्यूल b। वर्तमान में बी से कोई आयात नहीं किया जाता है क्योंकि वर्तमान में आयात किया जा रहा है और उस के खिलाफ अजगर गार्ड। और बी अब के लिए एक खाली मॉड्यूल है। इसलिए जब यह निष्पादित होता है b.hi(), तो यह कुछ भी नहीं पा सकता है।

ध्यान दें कि जो b.hi()निष्पादित किया गया है वह है a.py-> मॉड्यूल b -> मॉड्यूल a, 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

मैं इस मुद्दे के साथ कई बार पार कर चुका हूं, लेकिन मैंने इसके बारे में गहराई से खुदाई करने की कोशिश नहीं की। अब मैं मुख्य मुद्दे को समझता हूं।

इस बार मेरी समस्या निम्नलिखित जैसे विभिन्न मॉड्यूल से Serializers (django और restframework) आयात कर रही थी:

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

इसलिए, django runserver को समस्याओं के बिना निष्पादित किया गया था:

./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

मेरे मामले में अजगर 2.7 के साथ सुन्न संस्करण 1.15.0 के साथ काम करते हुए, इसके साथ काम किया

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