Estoy trabajando en un paquete en Python. Yo uso virtualenv. Establezco la ruta a la raíz del módulo en una ruta .pth en mi virtualenv, de modo que puedo importar módulos del paquete mientras desarrollo el código y hago las 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 usar 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 la razón / solución (pregunta 2)? Busqué en Google y desbordé la pila del error 'ImportError: no se puede importar' para PyTest, pero los resultados que obtuve estaban relacionados con la ruta de Python faltante y la solución a esto, que no parece ser el problema aquí. ¿Alguna sugerencia?
No puedo decir que entiendo por qué funciona esto, pero tuve el mismo problema y las pruebas funcionan bien si las ejecuto
python -m pytest
.Estoy en un virtualenv, con pytest también disponible a nivel mundial:
fuente
python -m pytest [...]
"también agregará el directorio actualsys.path
".python3 -m pytest
PYTHONPATH=.:./src pytest
como objetivo de creación .Acabo de resolver esto eliminando __init__.py en la raíz de mi proyecto:
fuente
__init__.py file in a folder containing TESTS
no resolvió mi problema. Este funcionó. Supongo que es por la jerarquía de archivos.__init__.py
archivo. Todavía estaba enfrentando problemas. Agregar el archivo conftest.py al directorio raíz funcionó para mí.Tuve el mismo problema pero por una razón diferente a las mencionadas:
Tenía py.test instalado globalmente, mientras que los paquetes se instalaron en un entorno virtual.
La solución fue instalarlo
pytest
en el entorno virtual. (En caso de que su shell tenga archivos ejecutables, como lo hace Bash, usehash -r
o use la ruta completa parapy.test
)fuente
pytest
el virtualenv creado porconda
, peropytest
está disponible en el entorno raíz de anaconda. Por lo tanto, se pudo encontrar pytest , pero no ningún paquete instalado en el entorno.pip3 install pytest
dentro de virtualenv solucionó el problema.Este problema ocurrirá si tiene un
tests.py
archivo y una carpeta de pruebas contests/__init__.py
.Durante la recopilación, pytest encuentra la carpeta, pero cuando intenta importar los archivos de prueba desde la carpeta, el
tests.py
archivo causará el problema de importación.Para solucionarlo, simplemente elimine el
tests.py
archivo y coloque todas sus pruebas dentro de latests/
carpeta.Para su caso específico, la solución será precisamente:
/home/zz/Desktop/GitFolders/rc/tests.py
/home/zz/Desktop/GitFolders/rc/tests/__init__.py
esté presentefuente
Tuve un problema similar, exactamente el mismo error, pero una causa diferente. Estaba ejecutando el código de prueba bien, pero contra una versión anterior del módulo. En la versión anterior de mi código existía una clase, mientras que la otra no. Después de actualizar mi código, debería haber ejecutado lo siguiente para instalarlo.
sudo pip install ./ --upgrade
Al instalar el módulo actualizado, ejecutar pytest produjo los resultados correctos (porque estaba usando la base de código correcta).
fuente
pip install ./ --upgrade
actualizó la versión instalada de la lib con el último código y permitió que pytest encontrara también esta última versión.En mi caso, el error de importación se produjo porque el paquete apunta a otro paquete / directorio con el mismo nombre y su ruta está un nivel por encima de la carpeta que realmente quería. Creo que esto también explica por qué algunas personas necesitan eliminar _ init _.py mientras que otras necesitan volver a agregar.
Solo puse
print(the_root_package.__path__)
(despuésimport the_root_package
) tanto en lapython
consola como en lospytest
scripts para comparar la diferenciaLÍNEA INFERIOR: cuando lo hace
python
, el paquete que importa puede ser diferente del paquete cuando lo ejecutapytest
.fuente
Instale los paquetes en su entorno virtual.
Luego inicie un nuevo shell y vuelva a generar su entorno virtual.
fuente
La respuesta anterior no funciona para mí. Simplemente lo resolví agregando la ruta absoluta del módulo que no se encuentra en la
sys.path
parte superior detest_xxx.py
(su módulo de prueba), como:fuente
test_main.py
, las puseconftest.py
en mi directorio de prueba y funcionó. Gracias por proporcionar una solución programática, en lugar de basura de archivos.Si está relacionado con el código de Python que se desarrolló originalmente en Python 2.7 y ahora se migró a Python 3.x, entonces el problema probablemente esté relacionado con un problema de importación.
por ejemplo, al importar un objeto desde un archivo:
base
que se encuentra en el mismo directorio, esto funcionará en python 2.x:en python 3.x debe reemplazar con
base
la ruta completa o.base
no hacerlo causará el problema anterior. así que intenta:fuente
Hoy estaba experimentando este problema y lo resolví llamando
python -m pytest
desde la raíz del directorio de mi proyecto.Llamar
pytest
desde la misma ubicación aún causaba problemas.Mi directorio de proyectos está organizado como:
El módulo
routes
fue importado en mitest_routes.py
como:from server.routes.routes import Routes
¡Espero que ayude!
fuente
Otro caso especial:
Tuve el problema al usar tox. Así que mi programa funcionó bien, pero las pruebas unitarias a través de toxinas seguían quejándose. Después de instalar los paquetes (necesarios para el programa), debe especificar adicionalmente los paquetes utilizados en las pruebas unitarias en el archivo tox.ini
fuente
Estaba obteniendo esto usando VSCode. Tengo un ambiente de conda. No creo que la extensión de Python de VScode pueda ver las actualizaciones que estaba haciendo.
Tuve que correr
pip install ./ --upgrade
fuente
Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Edite su conftest.py y agregue las siguientes líneas de código:
Y si intenta ejecutar el caso de prueba a través de la terminal, use el siguiente ejemplo:
fuente
NameError: name 'file' is not defined
- ¿A qué debería ser igual el archivo?Otra gran victoria para el sistema de importación de Python. Creo que la razón por la que no hay consenso es que lo que funciona probablemente depende de su entorno y de las herramientas que esté utilizando.
Estoy usando esto de VS Code, en el explorador de prueba en Windows en un entorno conda, Python 3.8.
La configuración que tengo que trabajar es:
Bajo esta configuración, intellisense funciona y también lo hace el descubrimiento de pruebas.
Tenga en cuenta que probé originalmente lo siguiente, como se recomienda aquí .
No pude encontrar ninguna manera de hacer que esto funcione desde VS Code porque la
src
carpeta simplemente voló la mente del sistema de importación. Puedo imaginar que hay una manera de hacer que esto funcione desde la línea de comandos. Como un converso relativamente nuevo a la programación de Python, me da una sensación nostálgica de trabajar con COM, pero es un poco menos divertido.fuente
Mis 2 centavos en esto: pytest fallará por casualidad si no está utilizando entornos virtuales. A veces simplemente funcionará, a veces no.
Por tanto, la solución es:
El código, usando Windows PowerShell:
Entonces finalmente
Un ejemplo de setup.py, para pip install -e:
fuente
No estoy de acuerdo con las publicaciones que dicen que debes eliminar cualquier
__init__.py
archivo. En su lugar, lo que debe hacer es modificar elsys.path
.Ejecute un experimento en el que imprima
sys.path
cuando ejecuta el código normalmente. Luego imprimasys.path
mientras ejecuta el código a través de pytest. Creo que encontrará que hay una diferencia entre estos dos caminos, de ahí por qué Pytest se rompe.Para solucionar este problema, inserte la ruta del primer experimento en el índice 0 del segundo.
Sea
'/usr/exampleUser/Documents/foo'
el primer elemento delprint(sys.path)
experimento 1.A continuación se muestra el código que debería solucionar su problema:
import sys sys.path[0] = '/usr/exampleUser/Documents/foo'
Ponga esto en la parte superior de su archivo, antes de su declaración de importación real.
Fuente: Estaba lidiando con esto yo mismo y el proceso anterior lo resolvió.
fuente
Mantuve todo igual y solo agregué un archivo de prueba en blanco en la carpeta raíz. Resuelto
Aquí están los hallazgos, este problema realmente me molestó por un tiempo. Mi estructura de carpetas era
y pytest se quejaría con ModuleNotFoundError y da la SUGERENCIA: asegúrese de que sus módulos / paquetes de prueba tengan nombres de Python válidos.
Presenté un archivo de prueba simulado al mismo nivel que el directorio mathsapp y tests. El archivo no contenía nada. Ahora pytest no se queja.
Resultado sin el archivo
Resultados con el archivo
fuente
Resolví mi problema configurando las
PYTHONPATH
Variables de entorno para la configuración específica con la que estoy ejecutando mis pruebas.Mientras ve el archivo de prueba en PyCharm:
Ctrl
+Shift
+A
Edit Configurations
PYTHONPATH
en Entorno> Variables de entorno.fuente
Simplemente coloque un
conftest.py
archivo vacío en el directorio raíz del proyecto, porque cuandopytest
descubre un conftest.py, modifica sys.path para que pueda importar cosas delconftest
módulo. Una estructura de directorio general puede ser:fuente
Tuve un problema similar y funcionó cuando agregué un
__init__.py
archivo en el directorio de pruebas.fuente
Podría ser que Pytest no esté leyendo el paquete como un módulo de Python mientras que Python sí (probablemente debido a problemas de ruta). Intente cambiar el directorio del script pytest o agregar el módulo explícitamente a su PYTHONPATH.
O podría ser que tenga dos versiones de Python instaladas en su máquina. Verifique su fuente de Python para pytest y para el shell de Python que ejecuta. Si son diferentes (es decir, Python 2 vs 3), utilícelo
source activate
para asegurarse de que está ejecutando el pytest instalado para el mismo python en el que está instalado el módulo.fuente
Para cualquiera que haya intentado todo y aún obtenga errores, tengo una solución.
En la carpeta donde está instalado pytest , vaya a la carpeta pytest-env .
Abra el archivo pyvenv.cfg .
En el archivo, cambie include-system-site-packages de falso a verdadero .
Espero que funcione. No olvides votar.
fuente
Si ya tiene archivos .pyc, intente eliminarlos.
Hoy, me encuentro con este problema, esto es lo que sucedió:
primero ejecuto pytest en mac (esto generará archivos pyc), luego ejecuto un contenedor docker (el sistema operativo es alpine), con el directorio del proyecto montado, y luego, cuando intento ejecutar pytest en el contenedor, se produce ImportError. después de limpiar todos los archivos pyc, no hay más errores.
Espero que esto pueda ser útil.
fuente
si necesita un archivo init .py en su carpeta, haga una copia de la carpeta y elimine init .py en ese para ejecutar sus pruebas, funciona para proyectos locales. Si necesita ejecutar la prueba con regularidad, vea si puede mover su init .py a un archivo separado.
fuente
[Resuelto] Antes de saltar directamente a la solución de eliminar / agregar
__init__.py
, es posible que también deseemos ver cómo se realizan las importaciones en sus clases. De hecho, perdí un día jugando con solo__init__.py
pensar que ese podría ser el problema :) Sin embargo, eso fue bastante informativo.En mi caso, era la forma incorrecta de llamar a clases de una clase de Python a otra clase de Python que estaba arrojando
ImportError
. Se corrigió la forma en que se llamarían las clases / módulos y funcionó a la perfección. Espero que esto ayude a otros también.Y sí, para un error similar, podríamos tener diferentes soluciones dependiendo de cómo esté escrito el código. Es mejor dedicar más tiempo a la autodepuración. Lección aprendida :) ¡Feliz codificación!
fuente
En mi caso, estoy trabajando en un contenedor y, lamentablemente, pytest tiene la tendencia a usar python2.7 en lugar de mi intérprete de python3 de elección.
En mi caso esto funcionó:
Mi estructura de carpetas
fuente
Había colocado todas mis pruebas en una carpeta de pruebas y recibía el mismo error. Resolví esto agregando un init .py en esa carpeta así:
fuente