Почему модули 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__.pY, если вы хотите !!! но модули/пакеты доступны только после импорта...если вы хотите импортировать все из модуля вы можете использовать
from logging import *отдых вы можете получить доступ к модулю обработчиков, как показано ниже тоже,
from loggin import handlers print dir(handlers)
недавно я столкнулся с такой же странной ситуацией. Итак, я уверен, что вы удалили какой-то сторонний импорт lib. Что удалены Либ, содержащиеся
from logging import handlersилиfrom logging import *иhandlers. А в другом скрипте у вас было что-то вродеimport loggingиlogging.handlersи вы думали, что это то, как все работает, как я сделал.