Почему импорт модуля python не импортирует вложенные модули?

Если я сделаю это:

import lxml 

в python,lxml.html не импортируется. Например, я не могу вызвать

5 ответов


импорт модуля или пакета в Python является концептуально простой операцией:

  1. найти .файл py, соответствующий импорту. Это включает в себя путь Python и некоторые другие механизмы, но приведет к определенному .файл py найден.

  2. для каждого уровня каталога в импорт (import foo.bar.baz имеет два уровня), найти соответствующий __init__.py file и выполните его. Выполнение его просто означает выполнение всех операторов верхнего уровня в папка.

  3. наконец, то .сам файл py (foo/bar/baz.py в этом случае) выполняется, то есть выполняются все операторы верхнего уровня. Все глобалы, созданные в результате этого выполнения, объединяются в объект module, и этот объект module является результатом импорта.

Если ни один из этих шагов не импортировал вложенные пакеты, то эти вложенные пакеты недоступны. Если они импортировали подпакеты, то они доступны. Авторы пакета могут делать, что хотят.


lxml называется пакета в Python, который является иерархической коллекцией модулей. Пакеты могут быть огромными, поэтому им разрешено быть избирательными в отношении того, что втягивается при импорте. В противном случае всем пришлось бы импортировать полную иерархию, что было бы пустой тратой ресурсов.


Это по дизайну. Пакет имеет возможность импортировать вложенный пакет в его __init__.py, тогда вы сможете получить доступ к вложенному пакету без проблем. Это вопрос выбора для писателя пакетов, и цель состоит в том, чтобы минимизировать количество кода, который вы, вероятно, не будете использовать.


lxml - Это пакет, а не модуль. Пакет представляет собой набор модулей. Как это происходит, вы также можете импортировать пакет напрямую, но это не автоматически импортирует все его подмодули.

Как Почему это, ну, это вопрос для BDFL. Я думаю, это, вероятно, потому, что пакеты обычно довольно большие, и импорт всех подмодулей будет чрезмерным штрафом за производительность.


Это позволяет загружать только минимальный объем кода для многосоставных библиотек, которые вы не можете использовать полностью. Например, вы можете не использовать html часть lxml, и поэтому не хочу иметь дело с погрузкой его код.