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

6 minutos de lectura

avatar de usuario
Zorglub29

Estoy trabajando en un paquete en Python. Yo uso virtualenv. Establecí 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) [email protected]:~/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) [email protected]:~/Desktop/GitFolders/rc$ python tests/test_ns.py 
issued command: echo hello
command output: hello

Sin embargo, si trato de usar PyTest, recibo algunos mensajes de error de importación:

(VEnvTestRc) [email protected]:~/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) [email protected]:~/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 el remedio para esto, que no parece ser el problema aquí. ¿Alguna sugerencia?

  • Esto también podría ser un problema de importación faltante

    – Espartaco

    24 de febrero a las 9:28

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 a nivel mundial:

(proj)[email protected] ~/dev/proj$ type -a python
python is /home/tom/.virtualenvs/proj/bin/python
python is /usr/bin/python

(proj)[email protected] ~/dev/proj$ python -V
Python 3.5.2

(proj)[email protected] ~/dev/proj$ type -a pytest
pytest is /home/tom/.virtualenvs/proj/bin/pytest
pytest is /usr/bin/pytest

(proj)[email protected] ~/dev/proj$ pytest --version
This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py

  • También hizo el trabajo para mí, la cuestión es que lo ejecuta la versión de python definida en lugar de su v.env.

    – Nebulosar

    24 de abril de 2018 a las 6:19

  • una razón podría ser que python -m pytest [...] “también agregará el directorio actual a sys.path.”

    – menosf

    5 de diciembre de 2018 a las 13:45

  • Tenía lo mismo en Windows 10, y ejecutar python -m pytest lo resolvió

    – Duccio

    12 de agosto de 2019 a las 17:35

  • Esto también funcionó dentro de mi entorno virtual que tuve que ejecutar python3 -m pytest

    –Rishi Raj

    4 de junio de 2020 a las 3:17

  • Basado en el comentario de @minusf que estoy usando PYTHONPATH=.:./src pytest como objetivo de fabricación.

    –Jan Groth

    26 de junio de 2020 a las 4:49

  • La respuesta aceptada __init__.py file in a folder containing TESTS no resolvió mi problema. Este funcionó. Supongo que es por la jerarquía de archivos.

    – smido

    8 mayo 2019 a las 20:51

  • he quitado __init__.py expediente. Todavía estaba enfrentando un problema. Agregar el archivo conftest.py al directorio raíz funcionó para mí.

    – Vijay Sali

    29 de enero de 2020 a las 8:28


  • Espero que conftest.py esté en /tests no en la raíz

    – Aaron Mc Millin

    29 de enero de 2020 a las 15:58

  • Esta solución funcionó para mí, pero ¿alguien sabe que esto causaría un error de importación?

    – Aldo Okware

    8 de junio de 2020 a las 12:26

  • ¡Esto también fue lo que me solucionó! En mi caso, creo que el problema también fue que la estructura de mi proyecto era proj_folder como raíz y tenía dos hijos proj_folder/project_folder y proj_folder/tests (el mismo nombre para la raíz y el subdirectorio del proyecto). Entonces, en uno de los archivos de prueba en la prueba, tuve una importación como: from proj_folder import main. Ahora, debido a que tenía un init en la raíz del proyecto, pytest estaba intentando obtener un módulo principal que en realidad estaba en project_folder/project_folder.

    – dia aburrido

    6 de junio a las 9:54

Tuve el mismo problema pero por otro motivo diferente a los mencionados:

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

La solución fue instalar pytest en el entorno virtual. (En caso de que su shell haga hash de ejecutables, como lo hace Bash, use hash -ro use la ruta completa para py.test)

  • Me acabo de dar cuenta de que tenía el mismo problema furtivo, usando anaconda. Olvidé agregar pytest en el virtualenv creado por condaaún pytest está disponible en el entorno raíz de anaconda. Por lo tanto pytest pudo se encuentra, pero no cualquier paquete instalado en el entorno.

    – Sobrecarga

    14 de febrero de 2018 a las 7:28


  • Tuve el mismo problema. pytest se instaló globalmente y no en virtualenv. pip3 install pytest dentro de virtualenv solucionó el problema.

    –Ankit Singh

    14 de septiembre de 2018 a las 14:03

  • Incluso lo tenía instalado en mi venv, pero por alguna razón no lo recogía. (which pytest mostró la versión incorrecta) Desactivar y reactivar el venv arregló todo.

    – escalera de cuerda

    2 de febrero de 2021 a las 23:32

avatar de usuario
David Buck

Tuve un problema similar y funcionó cuando agregué __init__.py archivo en el directorio de pruebas.

  • Me acabo de dar cuenta de que tenía el mismo problema furtivo, usando anaconda. Olvidé agregar pytest en el virtualenv creado por condaaún pytest está disponible en el entorno raíz de anaconda. Por lo tanto pytest pudo se encuentra, pero no cualquier paquete instalado en el entorno.

    – Sobrecarga

    14 de febrero de 2018 a las 7:28


  • Tuve el mismo problema. pytest se instaló globalmente y no en virtualenv. pip3 install pytest dentro de virtualenv solucionó el problema.

    –Ankit Singh

    14 de septiembre de 2018 a las 14:03

  • Incluso lo tenía instalado en mi venv, pero por alguna razón no lo recogía. (which pytest mostró la versión incorrecta) Desactivar y reactivar el venv arregló todo.

    – escalera de cuerda

    2 de febrero de 2021 a las 23:32

avatar de usuario
Neurona

Simplemente ponga un vacío conftest.py archivo en el directorio raíz del proyecto, porque cuando pytest descubre un conftest.pyse modifica sys.path para que pueda importar cosas desde el conftest módulo. Una estructura general de directorios puede ser:

Root
├── conftest.py
├── module1
│   ├── __init__.py
│   └── sample.py
└── tests
    └── test_sample.py

  • Esta es la mejor respuesta. olvida todo eso __init__.py locura.

    – Wisbucky

    11/09/2021 a las 21:27

  • No funcionó para mí. Todo muy raro.

    – mike roedor

    23 oct 2021 a las 18:16

  • No funcionó para mí también.

    – Shah Zain

    10 de enero a las 7:46

  • Trabajó para mi. Creo que esta es la solución a largo plazo para cualquiera que lo tenga trabajando con python -m pytest pero no quiere agregar palabrería adicional cada vez

    – Mayor Mayor

    11 de enero a las 1:08

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad