왜 파이썬 모듈은 때때로 하위 모듈을 가져 오지 않습니까?


88

오늘 제가 설명하고 싶은 이상한 것을 발견했습니다. 나는 이것을 질문으로 표현하는 방법을 100 % 확신하지 못했기 때문에 Google은 의문의 여지가 없습니다. 로깅 모듈은 이상한 이유로 모듈 logging.handlers에 액세스 할 수 없습니다. 나를 믿지 않는다면 직접 시도해보십시오.

>>> import logging
>>> logging.handlers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'>

왜 이런 일이 일어나는지 설명 할 수 있습니까?

답변:


119

Python에서 모듈에 액세스하려면 먼저 가져와야합니다. import logging로깅 모듈 만 가져옵니다. 너무 그렇게 logging서브 모듈과 패키지이지만, 그 하위 모듈은 여전히 자동으로로드되지 않습니다. 따라서 logging.handlers액세스하려면 먼저 명시 적으로 가져와야 합니다.

가끔씩 추가 가져 오기가 필요하지 않은 이유가 궁금하다면 일부 패키지는 가져올 때 하위 모듈의 일부 또는 전체를 가져 오기만하면됩니다 __init__.py. 다른 경우에는 가져 오는 다른 항목도 가져올 수 logging.handlers있습니다. 어떤 코드가 가져 오기를 수행하는지는 중요하지 않습니다. 긴만큼 뭔가 프로세스 수입 logging.handlers당신이 그것을 액세스하기 전에, 거기 수 있습니다. 그리고 때로는 패키지와 같은 모습이 정말 좋아, 하나의 모듈 아니라고 os하고 os.path. os패키지 아니다, 그냥 (플랫폼에 대한) 올바른 다른 모듈을 수입하고 그것을 호출 path당신이 그것을 액세스 할 수 있습니다 만, 그래서 os.path.


4

나는 또한 파이썬을 처음 접했고 많은 연습을 한 후에 package (folder), module (.py), classes, variables ... 등을 구분할 수 있습니다.

폴더 중 하나를 python 패키지로 만들고 싶다면- __init__.py빈 파일도 파일을 포함해야합니다 !!!

Thomas가 말했듯 __init__.p이 원한다면 y에 추가 모듈을 가져올 수 있습니다 !!! 하지만 모듈 / 패키지는 가져온 후에 만 ​​액세스 할 수 있습니다.

모듈에서 모든 것을 가져 오려면 사용할 수 있습니다.

from logging import *

나머지는 아래와 같이 핸들러 모듈에도 액세스 할 수 있습니다.

from logging import handlers
print dir(handlers)


5
사용하지 마십시오 from module import *. 거의 항상 실수입니다.
Thomas Wouters

당신이 패키지에 모든 것이 자동으로 가져올 수 원하는 경우에 그 수입 할 초기화 대신 설정에 평을 모두초기화가 평하고 일을 '패키지 가져 오기에서 *'어딘가에.
Thomas Wouters

2
@Pete : 모호함과 갈등을 야기하는 표준 네임 스페이스를 "오염"시키기 때문입니다. 내가 가지고 import zipper있고 내가 zipper.open()어떤 오픈을 부르고 있는지 정확히 알 수 있다면 . 반대로 from zipper import *그 뒤에는 open()빌트인 오픈 또는 지퍼 오픈 또는 다른 것이 있습니다. import zipper as z타이핑에 지친 경우 훨씬 선호됩니다zipper
msw

3
@Pete : 자신도 모르게 네임 스페이스의 일부를 덮어 쓸 수 있기 때문에 문제이기도합니다. numpy import *일부 numpy 함수는 numpy (IMO의 끔찍한 디자인 결함)를 모두 가져 오지 않으면 작동하지 않기 때문에 사용 했지만 numpy에는 가져 오는 개체 수가 엄청나게 많습니다. 결국 많은 함수를 덮어 쓰게되었습니다 (복사가 하나라고 생각합니다 ... 확인하기 너무 피곤합니다). 이제 numpy를 너무 많이 사용하여 계속해서 입력 할 수없는 경우 numpy를 np로 가져옵니다.
chriscauley

2
@dustynachos, 어떤 numpy 함수에 결함이 있습니까?
Winston Ewert 2013

2

Thomas Wouters 는이 질문에 매우 잘 대답했지만 아쉽게도 원본 문서에서 답을 찾은 후에야이 질문을 찾았습니다. 이를 위해 앞으로 검색 엔진의 최상위에 가까워지기를 바라면서 여기에 추가 할 것이라고 생각했습니다.

질문

왜 오류를 수행합니다 ' AttributeError : 모듈의 모듈 이름은 '어떤 속성이없는 ' sub_module_name '도 내 편집기 불구 표시 (예 : 비주얼 코드) 자동 완료 하위 모듈 이름을 :

 import module_name
 module_name.sub_module_name(parameter)

대답

편집기는 Python 동작이 아닌 프로젝트의 파일 구조를 기반으로 자동 완성됩니다. 모듈을 가져올 때 하위 모듈은 '자동으로'가져 오지 않습니다. 참조 파이썬 문서 방법 '자동으로'수입 하위 모듈에 대한 자세한 내용은 사용

 import module_name

이 답변의 주요 기여는 '모듈'또는 '패키지'를 가져올 때 AttributeError 추가입니다.

이것이 누군가를 돕기를 바랍니다!


1

나는 최근에 같은 이상한 상황에 직면했습니다. 따라서 타사 lib 가져 오기를 제거했을 것입니다. 그건 제거 lib 디렉토리가 포함 from logging import handlers또는 from logging import *당신을 제공 handlers. 그리고 다른 스크립트에서 당신은 import logging방금 사용한 것과 같은 것을 가지고 있었고 logging.handlers그것이 내가 한 것처럼 일하는 방식이라고 생각했습니다.

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