Прежде всего, вы найдете всю необходимую информацию в разделе 6 Учебника по Python .
(1) По-разному ли python обрабатывает импорт пакетов и модулей, существующих в pythonpath, по сравнению с тем, когда вы пытаетесь импортировать из текущего каталога?
Нет, это не так. На самом деле, Python всегда ищет sys.path
при импорте модулей. Модули в текущем каталоге находятся только потому, что sys.path
содержит запись с пустой строкой, означающей текущий каталог.
(2) Почему import testpackage
не дает мне доступа к testpackage.testmod
? Когда я импортирую os
, я могу получить доступ к os.path
(и т. Д.).
Для эффективности import testpackage
загружает только testpackage/__init__.py
. Если вам нужно testpackage.testmod
, вам нужно явно импортировать его:
import testpackage # Just imports testpackage, not testpackage.testmod!
import testpackage.testmod # Import *both* testpackage and testpackage.testmod!
Если вы всегда хотите экспортировать testmod
, импортируйте его в __init__.py
, это то, что делает os
(os/__init__.py
). Таким образом, testpackage.testmod
всегда доступен неявно, если вы импортируете testpackage
.
Поскольку Python является кроссплатформенным, фактически невозможно последовательно и автоматически загружать модули в каталог, поскольку некоторые файловые системы нечувствительны к регистру (Windows!). Python не знает, загружать ли os/path.py
как os.path
или os.Path
и т. Д.
(3) Следует ли с пакетом использовать один __init__.py
в базовом каталоге или вкладывать их в последующие каталоги?
Вам всегда нужно __init__.py
для каждого подпакета. Были дискуссии об отмене этого требования, но было решено оставить его как есть.
(4) Как я могу импортировать модуль с указанием имени пакета? И.Е. из testmod.py
я бы хотел импортировать testpackage.testmod2
, а не просто testmod2
.
Это должно работать. Просто убедитесь, что вы запускаете код из каталога верхнего уровня. Если текущий каталог testpackage
, testmod
не знает, что он в пакете.
Предпочтительным способом является использование относительного импорта внутри пакета, хотя:
from . import testmod2
Это предотвращает конфликт имен, если существует глобальный модуль с именем testmod2
, и позволяет без проблем использовать имена известных модулей в вашем пакете.
(5) Как правильно импортировать подмодули из каталога sububs?
Единственное решение, которое я вижу, - добавить этот каталог в pythonpath из __init__.py
, но я не знаю, правильный ли это путь.
Нет, не делай этого! Никогда, никогда не помещайте каталог в sys.path
, когда один из его родительских каталогов уже находится в sys.path
! Это может привести к тому, что ваши модули будут загружены дважды, и это плохо!
Обычно вы можете загружать модули из подпакетов, используя абсолютный или относительный импорт:
import testpackage.testsubs.testsubmod
from testpackage.testsubs import testsubmod
from .testsubs import testsubmod
Просто создайте __init__.py
в testsubs/
!