pytest no puede importar el módulo mientras que Python puede

Resuelto Zorglub29 asked hace 7 años • 45 respuestas

Estoy trabajando en un paquete en Python. Yo uso virtualenv. Configuré la ruta a la raíz del módulo en una ruta .pth en mi virtualenv, para poder importar módulos del paquete mientras desarrollo el código y hago pruebas (Pregunta 1: ¿es una buena manera de hacerlo?). Esto funciona bien (aquí hay un ejemplo, este es el comportamiento que quiero):

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py 
issued command: echo hello
command output: hello

Sin embargo, si intento utilizar PyTest, recibo algunos mensajes de error de importación:

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile: 
collected 0 items / 1 errors 

================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
    from rc import ns
E   ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest

Estoy un poco desconcertado, parece que esto indica un error de importación, pero Python lo hace bien, entonces ¿por qué hay un problema específicamente con PyTest? ¿Alguna sugerencia sobre el motivo/remedio (Pregunta 2)? Busqué en Google y desbordé el error 'ImportError: no se puede importar' para PyTest, pero los resultados que obtuve estaban relacionados con la falta de la ruta de Python y la solución a esto, lo que no parece ser el problema aquí. ¿Alguna sugerencia?

Zorglub29 avatar Jan 20 '17 00:01 Zorglub29
Aceptado

Encontré la respuesta:

NO coloque un __init__.pyarchivo en una carpeta que contenga PRUEBAS si planea usar pytest. Tenía uno de esos archivos y eliminarlo resolvió el problema.

En realidad, esto quedó oculto en los comentarios a la segunda respuesta del problema de PATH con pytest 'ImportError: No hay módulo llamado YadaYadaYada', así que no lo vi, espero que tenga más visibilidad aquí.

Zorglub29 avatar Jan 19 '2017 21:01 Zorglub29

No puedo decir que entiendo por qué esto funciona, pero tuve el mismo problema y las pruebas funcionan bien si ejecuto python -m pytest.

Estoy en un virtualenv, con pytest también disponible globalmente:

(proj)tom@neon ~/dev/proj$ type -a python
python is /home/tom/.virtualenvs/proj/bin/python
python is /usr/bin/python

(proj)tom@neon ~/dev/proj$ python -V
Python 3.5.2

(proj)tom@neon ~/dev/proj$ type -a pytest
pytest is /home/tom/.virtualenvs/proj/bin/pytest
pytest is /usr/bin/pytest

(proj)tom@neon ~/dev/proj$ pytest --version
This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py
Tom avatar Mar 26 '2018 10:03 Tom

Acabo de resolver esto eliminando __init__.pyen la raíz de mi proyecto:

.
├── __init__.py <--- removed
├── models
│   ├── __init__.py
│   ├── address.py
│   ├── appointment.py
│   └── client.py
├── requirements.txt
├── setup.cfg
├── tests
│   ├── __init__.py
│   ├── models
│   │   ├── __init__.py
│   │   ├── appointment_test.py
│   │   └── client_test.py
│   └── other_test.py
└── script.py
Aaron McMillin avatar May 17 '2018 20:05 Aaron McMillin

Tuve el mismo problema pero por otros motivos distintos a los mencionados:

Tenía py.test instalado globalmente, mientras que los paquetes se instalaban en un entorno virtual.

La solución fue instalar pytesten el entorno virtual. (En caso de que su shell tenga ejecutables hash, como lo hace Bash, use hash -r, o use la ruta completa a py.test)

Mark avatar Jan 05 '2018 19:01 Mark