Импорт локальных модулей в python v. IPython - PullRequest
0 голосов
/ 24 мая 2018

Я обнаружил, что 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, я получаю два разных результата:

IPython works, python does not.

Почему работает один, а не другой?Можно ли сделать дескриптор 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.

1 Ответ

0 голосов
/ 24 мая 2018

Я не могу объяснить вам, почему это происходит, но, возможно, это могло бы работать на python , если вы сделаете файл b.py похожим на это:

from a import foo
foo()

Для меня нет смысла использовать src.a, потому что src - это (тот же) каталог.Но опять же, я не знаю, почему один работает, а другой нет. Обратитесь к 3-му примеру этого ответа

...