Почему модули Python иногда не импортируют свои субмодули?
Я заметил что-то странное сегодня я хотел бы объяснить. Я не был на 100% уверен, как даже сформулировать это как вопрос, поэтому google не может быть и речи. Модуль ведения журнала не имеет доступа к журналу модуля.обработчики по какой-то странной причине. Попробуйте сами, если не верите мне:
>>> 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'>
может кто-нибудь объяснить, почему это происходит?
3 ответа:
в Python, модули должны быть импортированы, прежде чем они доступны.
import logging
импортирует только модуль регистрации. Бывает так, чтоlogging
- это пакет с подмодулями, но эти подмодули все еще не загружаются автоматически. Итак, вам нужно явно импортироватьlogging.handlers
прежде чем вы можете получить к нему доступ.Если вам интересно, почему иногда кажется, что вам не нужны эти дополнительные импорт: некоторые пакеты импортируют некоторые или все свои подмодули, когда они импортируются - просто делая эти импорта в их
__init__.py
файлы. В других случаях это может быть что-то еще, что вы импортируете, также импортировалиlogging.handlers
. Не имеет значения, какой фрагмент кода выполняет импорт; пока что-то в процессе импортаlogging.handlers
прежде чем вы получите доступ к нему, он будет там. И иногда модуль, который выглядит как пакет действительно не один, какos
иos.path
.os
это не пакет, он просто импортирует правильный другой модуль (для вашей платформы) и вызывает егоpath
, просто чтобы вы могли получить к нему доступ какos.path
.
Я тоже новичок в Python и после того, как много практики теперь я могу различать, пакет (папка) , модуль(.py), классы, переменные...так далее...
если вы хотите, чтобы любая из ваших папок была пакетом python-она должна содержать
__init__.py
файл даже пустой файл будет делать !!!и как сказал Томас, вы можете импортировать дополнительный модуль в
__init__.p
Y, если вы хотите !!! но модули/пакеты доступны только после импорта...если вы хотите импортировать все из модуля вы можете использовать
from logging import *
отдых вы можете получить доступ к модулю обработчиков, как показано ниже тоже,
from loggin import handlers print dir(handlers)
недавно я столкнулся с такой же странной ситуацией. Итак, я уверен, что вы удалили какой-то сторонний импорт lib. Что удалены Либ, содержащиеся
from logging import handlers
илиfrom logging import *
иhandlers
. А в другом скрипте у вас было что-то вродеimport logging
иlogging.handlers
и вы думали, что это то, как все работает, как я сделал.