В настоящее время я использую установленную 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
не сталкиваясь с проблемами импорта.
Это единственный способ, с помощью которого мне удалось это реализовать, однако решение кажется примитивным и неэлегантным.