Я обнаружил, что IPython и python по-разному обрабатывают загрузку локальных модулей, и мне интересно, может кто-нибудь объяснить, почему это происходит.
Предположим, что мой проект структурирован как:
top_level/
src/
a.py
b.py
__init__.py
Содержимое b.py
:
from src.a import foo
foo()
, а затем a.py
имеет функцию foo
:
def foo():
print('It worked!')
Файл __init__.py
пуст.
Если я вызываю ipython и python из top_level
, я получаю два разных результата:
Почему работает один, а не другой?Можно ли сделать дескриптор Python похожим на IPython или есть более питонский способ обработки таких случаев?
Информация о версии:
- Python: 3.6.3
- IPython: 6.1.0 (с 3.6.3 Python)
Редактировать , чтобы объяснить разницу с "Как импортировать локальный модуль?"Этот вопрос касается различий между тем, как IPython и Python обрабатывают импорт локальных модулей, а не тем, как импортировать локальный модуль.
Я должен также добавить это - хотя это правда, что мой пример будет работать, если я изменю оператор импортак from a import foo
- я (неявно) пытался избежать этого.Мне нравится идея импортировать все относительно некоторого каталога верхнего уровня, чтобы облегчить изменение структуры файлов.Например, если b.py
был перемещен из src
в какой-то подкаталог src/core
, вам нужно будет пройти и переписать все операции импорта относительно нового местоположения b.py
.