Почему модули Python иногда не импортируют свои подмодули? - PullRequest
70 голосов
/ 23 сентября 2010

Я заметил кое-что странное сегодня, которое я хотел бы объяснить. Я не был уверен на 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'>

Может кто-нибудь объяснить, почему это происходит?

Ответы [ 4 ]

95 голосов
/ 23 сентября 2010

В Python модули должны быть импортированы, прежде чем они станут доступны.import logging импортирует только модуль регистрации.Бывает, что logging - это пакет с субмодулями, но эти субмодули по-прежнему не загружаются автоматически.Итак, вам нужно явно импортировать logging.handlers, прежде чем вы сможете получить к нему доступ.

Если вам интересно, почему это выглядит, иногда вам не нужны эти дополнительные импорты: некоторые пакеты импортируют некоторые или все свои подмодуликогда они импортируются - просто выполняя эти импорты в своих __init__.py файлах.В других случаях это может быть что-то еще, что вы импортируете, также импортированное logging.handlers.Неважно, какой фрагмент кода выполняет импорт;пока что-то в вашем процессе импортирует logging.handlers, прежде чем вы получите к нему доступ, оно будет там.И иногда модуль, который выглядит как пакет, на самом деле не один, как os и os.path.os не является пакетом, он просто импортирует другой правильный модуль (для вашей платформы) и вызывает его path, просто чтобы вы могли получить к нему доступ как os.path.

3 голосов
/ 23 сентября 2010

Я также новичок в Python, и после большой практики теперь я могу различать, пакет (папка), модуль (.py), классы, переменные ... и т.д ...

если вы хотите, чтобы любая ваша папка была пакетом Python - она ​​должна содержать файл __init__.py, даже пустой файл подойдет !!!

и, как сказал Томас, вы можете импортировать дополнительный модуль в __init__.p y, если хотите !!! но модули / пакеты доступны только после его импорта ...

если вы хотите импортировать все из модуля, вы можете использовать

from logging import *

остальные вы можете получить доступ к модулю обработчиков, как показано ниже,

from logging import handlers
print dir(handlers)

1 голос
/ 06 июля 2019

Томас Воутерс очень хорошо ответил на этот вопрос, но, увы, я нашел этот вопрос только после того, как нашел ответ в оригинальной документации. С этой целью я подумал, что добавлю это в надежде, что в будущем она появится ближе к вершине поисковой системы.

ВОПРОС

Почему ошибка: ' AttributeError: module' module_name 'не имеет атрибута * sub_module_name ' появляется даже хотя мой редактор (например, Visual Code) автоматически завершает подмодуль Имя:

 import module_name
 module_name.sub_module_name(parameter)

ОТВЕТ

Ваш редактор основывает свое автозаполнение на файловой структуре вашего проекта, а не на поведении Python. Подмодули не являются «автоматически» импортируется при импорте модуля. Ссылка Документация Python для получения подробной информации о том, как "автоматически" импортировать субмодули при использовании

 import module_name

Ключевым вкладом в этом ответе является добавление AttributeError при попытке импортировать «модуль» или «пакет»

Надеюсь, это кому-нибудь поможет!

1 голос
/ 19 октября 2016

Я недавно столкнулся с такой же странной ситуацией. Бьюсь об заклад, вы удалили сторонний импорт lib. Что удалил lib содержал from logging import handlers или from logging import * и предоставил вам handlers. А в другом сценарии у вас было что-то вроде import logging и вы просто использовали logging.handlers, и вы подумали, что так все работает, как и я.

...