AttributeError : 'module'객체에 속성이 없습니다


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있지만 실제로 가져 오기 작업은 처음에만 수행됩니다. 모듈을 가져올 때 두 번째 및 그 이후에는 빠른 작업입니다. )


93

또한 표준 Python 모듈 중 하나와 이름이 같은 모듈을 실수로 명명 할 때이 오류가 발생했습니다. 예를 들어 commands파이썬 라이브러리 모듈 이라는 모듈이 있습니다. 로컬 개발 환경에서 올바르게 작동했지만 Google App Engine에서 실행할 때 지정된 오류로 실패하여 추적하기가 어려웠습니다.


42

문제는 모듈 간의 순환 종속성입니다. a수입 bb수입 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.ba.c) 의 하위 모듈을 명시 적으로 가져온다는 사실을 알지 못했기 때문에 import실제로 명령문을 가져온 것으로 가정했습니다 a.


6

나는 같은 문제에 직면했다. 를 사용하여 수정했습니다 reload.

import the_module_name
from importlib import reload
reload(the_module_name)

5

git에서 이전 버전의 저장소를 체크 아웃 할 때이 문제가 발생했습니다. 힘내 내 .py파일을 교체 했지만 추적되지 않은 .pyc파일을 남겼습니다 . 때문에 .py파일과 .pyc파일 동기화 밖으로했다는 importA의 명령 .py파일에서 해당 모듈을 찾을 수 없습니다 .pyc파일.

해결책은 단순히 .pyc파일 을 삭제하고 자동으로 재생성하는 것입니다.


이 명령을 사용하여 모든 .pyc파일 을 삭제할 수 있습니다.find . -name "*.pyc" -exec rm -f {} \;
Ollie

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

더 많은 문서 확인 : here


3

위의 모든 대답은 훌륭하지만 여기에 차임하고 싶습니다. 위에서 언급 한 문제를 발견하지 못한 경우 작업 환경을 정리하십시오. 그것은 나를 위해 일했다.


0

아래 변경 사항이 어떻게 내 문제를 정렬했는지 확실하지 않습니다.

예를 들어 파일 이름이 emoji.py와 같고 emoji를 가져 오려고했습니다. 그러나 파일 이름을 변경하면 문제가 해결되었습니다.

희망이 도움이됩니다.


0

원형 가져 오기로 인해 문제가 발생하지만 Python에는 기본 제공 완화 방법이 있습니다.

문제는를 실행할 때 python a.py실행 a.py되지만 모듈로 가져온 것으로 표시하지 않는 것입니다. 따라서 a.py-> 모듈 b 가져 오기-> 모듈 a 가져 오기-> 모듈 b 가져 오기. b가 현재 수입되고 있기 때문에 마지막 수입은 no-op이며 파이썬은 그것을 막습니다. 그리고 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

RichieHindie의 답변과 비슷하지만 클래스가있는 모양의 또 다른 예입니다.


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

필자의 경우 numpy 버전 1.15.0으로 python 2.7을 사용하는 경우

pip install statsmodels=="0.10.0"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.