Суть пакетов и модулей Python в том, что, как и все остальное в Python, они являются динамическими. __name__
каждого модуля зависит от того, где он находится относительно корневых путей Python (на sys.path
). Таким образом, если у вас есть папка с именем pkg
, даже если она содержит __init__.py
, она на самом деле не является «пакетом», если она находится на sys.path
напрямую. Если папка pkg
находится в sys.path
напрямую (например, потому что вы запустили там интерпретатор Python), то это не пакет, и любые файлы .py
внутри нее являются модулями верхнего уровня, а не модулями внутри каких-либо пакет. Таким образом, если у вас есть foo.py
внутри папки pkg
, при запуске интерпретатора Python изнутри pkg
, настоящее * официальное имя foo.py
равно foo
, а не pkg.foo
.
Если папка, которая содержит pkg
, не включена в sys.path
, там равно без пакета pkg
- from pkg import foo
не будет работать с ImportError
. И если оба pkg
и папка, содержащая pkg
, находятся на sys.path
, то ваш путь Python искажен, и у вас есть два отдельных импортируемых модуля, pkg.foo
и foo
(с независимыми копиями всех их глобальных переменных). !).
Чтобы решить эту проблему, рекомендуется отделять исполняемые скрипты и импортируемые модули и пакеты друг от друга. Это позволяет вам поместить все ваши импортируемые модули и пакеты в общее место (как правило, под site-packages
для вашей установки Python), и ваши исполняемые скрипты могут импортировать их, используя полное имя, независимо от того, где расположены скрипты (как правило, где-то вроде /usr/bin
или /usr/local/bin
).