PYTHONPATH не обновляется

PYTHONPATH не обновляется

В настоящее время я использую установленную pyenvопределенную pythonверсию. Затем я использую ее pipenvдля создания виртуальных сред для своих различных проектов в python.

В настоящее время у меня примерно такая структура проекта:

foo/
  src/app.py
  src/__init__.py
  tests/unit/test_app.py
  tests/unit/__init_.py

Существует определенное количество тестов, test_app.pyкоторые импортируют app.pyкак:

import src.app

У меня две проблемы:

  • Редакторы кода, такие как emacs, vimили vscodeжалуются на этот importпункт в тестах, помечая его красным и считая «умеренно» раздражающим.
  • Из текстовых редакторов, которые я вызываю pipenv run pytestдля проверки тестов. Он терпит неудачу, потому что srcне является модулем, который он может найти. Если я вызываю ту же команду из своего терминала в каталоге проекта, я получаю ту же ошибку.

Если я вызываю его как pythonмодуль, то pipenv run python -m pytestон работает, так как добавляет текущий каталог в PYTHONPATH. Если я запускаю редакторы из , pipenv shellтесты также работают. Независимо от того, как я запускаю редакторы, он import src.appпомечен как недействительный.

Если я запускаю редактор настроек, PYTHONPATH=$PYTHONPATH:.тесты также работают, но проверка синтаксиса все еще ругается.

Какой самый чистый способ справиться с этим с помощью редакторов вроде emacsили vim? Я бы не хотел переходить на pycharmи подобные инструменты, которые «автоматически» решают эту проблему.

решение1

Согласно документации: загружается pipenvлюбой .envфайл в каталоге, из которого он вызывается.pipenv

Это означает, что (например) когда вы открываете test_app.pyфайл emacsво время использования pythonслоя, файл pipenvпроекта загружается (как обычно), но файл .envтакже автоматически загружается, и внутренние зависимости файла будут работать.

Так, например, .envдля меня работает создание с использованием следующего контента в корне проекта:

PYTHONPATH=$PYTHONPATH:.

Теперь вы также сможете запускать модульные тесты напрямую, emacsне сталкиваясь с проблемами импорта.

Это единственный способ, с помощью которого мне удалось это реализовать, однако решение кажется примитивным и неэлегантным.

Связанный контент