Почему модули 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 62

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 и вы думали, что это то, как все работает, как я сделал.