Функция импорта из родительского каталога - PullRequest
0 голосов
/ 04 октября 2019

У меня есть каталог, который содержит набор функций и другую папку, в которой содержится мой основной проект, который я хотел бы запустить из терминала: kf_sine_demo.py.

enter image description here

Когда я построчно запускаю код из VS-Code (используя Shift + Enter), все работает нормально. В частности, я могу импортировать функции для дальнейшего использования:

from EKFUKF_Py import lti_disc, kf_predict, kf_update, rts_smooth

Однако, когда я запускаю файл с терминала:

python kf_sine_demo.py

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "EKFUKF_Py/demo/kf_sine_demo/kf_sine_demo.py", line 16, in <module>
    from EKFUKF_Py import lti_disc, kf_predict, kf_update, rts_smooth
ModuleNotFoundError: No module named 'EKFUKF_Py'

Я вижу решения, которые включают указание полного пути. У меня есть сильные предпочтения относительно относительного импорта.


ОБНОВЛЕНИЕ:

Это решение было наиболее полезным для меня: https://stackoverflow.com/a/37193862/4576194.

  • Выполнить python -m EKFUKF_Py.demo.kf_sine_demo.kf_sine_demoиз родительского каталога EKFUKF_Py

Но это не совсем то, что я хочу. Я хочу иметь возможность запускать python kf_sine_demo.py из каталога kf_sine_demo и хочу, чтобы он знал, что функции, необходимые для его импорта, расположены на 2 уровня выше.

1 Ответ

1 голос
/ 04 октября 2019

Вы должны понимать, как работает путь Python. Это список каталогов, где python ищет модули, которые вы пытаетесь импортировать, вы можете отобразить его с помощью команды sys.path. Существует несколько каталогов, которые python автоматически добавляет, например path\to\your_python_install\lib, и python также добавляет рабочий каталог при запуске сценария.

Это означает, что при выполнении:

python kf_sine_demo.py

Родительский каталог этого файла (kf_sine_demo) добавляется в путь, а EKFUKF_Py - нет. Таким образом, Python не может найти модули в нем.

Отсюда два решения. Либо вы добавляете этот каталог вручную (что я нахожу немного уродливым, но он работает):

sys.path.append("path/to/EKFUKF_Py")

Или вы всегда запускаете файлы из основного каталога, например, через файл main.py,оттуда вы сможете вызывать каждый подмодуль в этом каталоге.

Подробнее здесь: https://www.devdungeon.com/content/python-import-syspath-and-pythonpath-tutorial

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...