У меня есть проект Python со следующей структурой:
testapp/
├── __init__.py
├── api
│ ├── __init__.py
│ └── utils.py
└── utils.py
Все модули пустые, кроме testapp/api/__init__.py
, который имеет следующий код:
from testapp import utils
print "a", utils
from testapp.api.utils import x
print "b", utils
и testapp/api/utils.py
, который определяет x
:
x = 1
Теперь из корня я импортирую testapp.api
:
$ export PYTHONPATH=$PYTHONPATH:.
$ python -c "import testapp.api"
a <module 'testapp.utils' from 'testapp/utils.pyc'>
b <module 'testapp.api.utils' from 'testapp/api/utils.pyc'>
Результат импорта меня удивляет, потому что он показывает, что второй оператор import
перезаписал utils
. Однако документы указывают, что оператор не свяжет имя модуля:
Форма from не связывает имя модуля: она проходит через список идентификаторов, просматривает каждый из них в модуле, найденном на этапе (1) и связывает имя в локальном пространстве имен с объектом найдено.
И действительно, когда в терминале я использую оператор from ... import ...
, имена модулей не вводятся:
>>> from os.path import abspath
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
Я подозреваю, что это связано с Python во время второго оператора импорта, пытающегося импортировать testapp.api.utils
, который ссылается на testapp.utils
и не работает, но я не уверен.
Что здесь происходит?