Actualmente suelo pyenv
tener python
instalada una versión particular. Luego utilizo pipenv
para crear entornos virtuales para mis diversos proyectos en python
.
Actualmente tengo una estructura de proyecto similar a:
foo/
src/app.py
src/__init__.py
tests/unit/test_app.py
tests/unit/__init_.py
Hay un número determinado de pruebas test_app.py
que importan app.py
como:
import src.app
Tengo dos problemas:
- A los editores de código les gusta
emacs
,vim
ovscode
se quejan de esaimport
cláusula de las pruebas, marcándola en rojo y siendo "moderadamente" molesta. - Desde los editores de texto que invoco
pipenv run pytest
para comprobar las pruebas. Falla porquesrc
no es un módulo que pueda encontrar. Si invoco el mismo comando desde mi terminal en el directorio del proyecto, aparece el mismo error.
Si lo invoco como un python
módulo, pipenv run python -m pytest
funciona, ya que agrega el directorio actual a PYTHONPATH
. Si inicio los editores desde a, pipenv shell
las pruebas también funcionan. Independientemente de cómo inicie los editores, import src.app
se marca como no válido.
Si inicio la configuración del editor, PYTHONPATH=$PYTHONPATH:.
las pruebas también funcionan, pero la verificación de sintaxis aún se queja.
¿Cuál es la forma más limpia de manejar esto con editores como emacs
o vim
? No me gustaría pasar pycharm
a herramientas similares que resuelvan "automáticamente" este problema.
Respuesta1
Según pipenv
documentación; Se carga cualquier .env
archivo en el directorio pipenv
desde donde se invoca.
Esto significa que (por ejemplo) cuando abre test_app.py
mientras emacs
usa la python
capa, la pipenv
del proyecto se carga (como de costumbre), pero .env
también se carga automáticamente y las dependencias internas del archivo funcionarán.
Entonces, por ejemplo, crear .env
con este contenido en la raíz del proyecto me funciona:
PYTHONPATH=$PYTHONPATH:.
Ahora, también podrá ejecutar pruebas unitarias directamente emacs
sin tener problemas con las importaciones.
Esta es la única forma en que pude hacerlo funcionar, pero la solución parece pirateada y poco elegante.