스크립트에서 설치된 패키지를 가져 오면 "AttributeError : module has no attribute"또는 "ImportError : cannot import name"이 발생합니다.

python exception python-module shadowing


요청 패키지를 가져 오는 requests.py 라는 스크립트가 있습니다 . 스크립트는 패키지에서 속성에 액세스 할 수 없거나 가져올 수 없습니다. 왜 이것이 작동하지 않으며 어떻게 해결합니까?

다음 코드는 AttributeError 를 발생 시킵니다.

import requests

res = requests.get('http://www.google.ca')
print(res)
Traceback (most recent call last):
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    import requests
  File "/Users/me/dev/rough/requests.py", line 3, in <module>
    requests.get('http://www.google.ca')
AttributeError: module 'requests' has no attribute 'get'

다음 코드는 ImportError 를 발생 시킵니다.

from requests import get

res = get('http://www.google.ca')
print(res)
Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests import get
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests import get
ImportError: cannot import name 'get'

또는 requests 패키지 내의 모듈에서 가져 오는 코드 :

from requests.auth import AuthBase
Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests.auth import AuthBase
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests.auth import AuthBase
ImportError: No module named 'requests.auth'; 'requests' is not a package




Answer 1 idjaw


이는 requests.py 라는 로컬 모듈 이 사용하려는 설치된 requests 모듈을 가리기 때문에 발생 합니다. 현재 디렉토리는 sys.path 앞에 추가 되므로 로컬 이름이 설치된 이름보다 우선합니다.

이것이 발생할 때 추가적인 디버깅 팁은 Traceback을주의 깊게보고 해당 스크립트의 이름이 가져 오려는 모듈과 일치 함을 인식하는 것입니다.

스크립트에서 사용한 이름을 확인하십시오.

File "/Users/me/dev/rough/requests.py", line 1, in <module>

가져 오려는 모듈 : requests

이름 충돌을 피하기 위해 모듈 이름을 다른 것으로 바꾸십시오.

파이썬은 생성 할 수 requests.pyc 의 당신의 옆에 파일 requests.py 의 파일합니다 (에 __pycache__ 의 파이썬 3 디렉토리). 인터프리터는 여전히 해당 파일을 참조하여 오류를 재현하므로 이름을 바꾼 후에도 제거하십시오. 그러나, pyc 에서 파일 __pycache__해야 경우 코드에 영향을주지 py 파일이 제거되었습니다.

실시 예에서,로 파일 이름 변경 my_requests.py 을 제거 requests.pyc 를 , 성공적 다시 인쇄를 실행 <Response [200]> .




Answer 2 Dave Rove


원래 질문을 작성한 사람과 "AttributeError : module has attribute"문자열을 검색하는 사람들에게 허용되는 답변에 따라 일반적인 설명은 사용자가 만든 스크립트가 라이브러리와 이름 충돌이 있다는 것입니다 파일 이름. 그러나 오류는 위의 경우와 같이 오류를 생성하는 스크립트 이름이나 해당 스크립트에서 명시 적으로 가져온 라이브러리 모듈 이름에 있지 않을 수 있습니다. 어떤 파일이 문제를 일으키는 지 알아 내기 위해서는 약간의 탐정 작업이 필요할 수 있습니다.

문제를 설명하기위한 예로서, 소수를 사용한 정확한 부동 소수점 계산을 위해 "소수"라이브러리를 사용하는 스크립트를 작성하고 " import decimal " 행을 포함하는 스크립트의 이름을 " mydecimal.py " 라고 가정 하십시오. . 아무 문제가 없지만이 오류가 발생한다는 것을 알았습니다.

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

"소수"라이브러리는 표준 라이브러리 "numbers"를 호출하지만 대신 이전 스크립트를 찾기 때문에 이전에 " numbers.py " 라는 스크립트를 작성한 경우 이런 상황이 발생합니다 . 당신이 그것을 삭제하더라도, 파이썬이 그것을 바이트 코드로 변환하고 캐시에 " numbers.pyc " 로 저장했기 때문에 문제를 끝내지 않을 수도 있습니다 . 따라서 그것을 찾아야 합니다.