태그 보관물: python

python

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

오늘 제가 설명하고 싶은 이상한 것을 발견했습니다. 나는 이것을 질문으로 표현하는 방법을 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'>

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



답변

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

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


답변

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

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

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

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

from logging import *

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

from logging import handlers
print dir(handlers)


답변

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

질문

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

 import module_name
 module_name.sub_module_name(parameter)

대답

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

 import module_name

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

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


답변

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


답변