Atualmente eu uso pyenv
uma versão específica python
instalada. Então eu uso pipenv
para criar ambientes virtuais para meus vários projetos em python
.
Atualmente tenho uma estrutura de projeto semelhante a:
foo/
src/app.py
src/__init__.py
tests/unit/test_app.py
tests/unit/__init_.py
Há um determinado número de testes que test_app.py
importam app.py
como:
import src.app
Eu tenho dois problemas:
- Editores de código gostam
emacs
ou reclamam dessa cláusula dos testes, marcando-a em vermelho e sendo "moderadamente" irritantevim
.vscode
import
- Dos editores de texto que invoco
pipenv run pytest
para verificar os testes. Ele falha porquesrc
não é um módulo que possa encontrar. Se eu invocar o mesmo comando do meu terminal no diretório do projeto, recebo o mesmo erro.
Se eu invocá-lo como um python
módulo, pipenv run python -m pytest
ele funciona, pois adiciona o diretório atual ao arquivo PYTHONPATH
. Se eu iniciar os editores a partir de, pipenv shell
os testes também funcionarão. Independentemente de como eu inicio os editores, eles import src.app
estão marcados como inválidos.
Se eu iniciar a configuração do editor, PYTHONPATH=$PYTHONPATH:.
os testes também funcionarão, mas a verificação de sintaxe ainda reclamará.
Qual é a maneira mais limpa de lidar com isso com editores como emacs
ou vim
? Eu não gostaria de mudar para pycharm
ferramentas semelhantes que resolvem esse problema "automaticamente".
Responder1
Conforme pipenv
documentação; Qualquer .env
arquivo no diretório pipenv
de onde é invocado é carregado.
Isso significa que (por exemplo) quando você test_app.py
abre emacs
enquanto usa a python
camada, o arquivo pipenv
do projeto é carregado (como de costume), mas .env
também é carregado automaticamente e as dependências internas do arquivo funcionarão.
Por exemplo, criar .env
com este conteúdo na raiz do projeto funciona para mim:
PYTHONPATH=$PYTHONPATH:.
Agora você também poderá executar testes unitários diretamente emacs
sem enfrentar problemas com as importações.
Essa foi a única maneira de fazê-lo funcionar, mas a solução parece hackeada e deselegante.