276 votes

pytest ne peut pas importer de module alors que python le peut

Je travaille sur un paquet en Python. J'utilise virtualenv. J'ai défini le chemin vers la racine du module dans un chemin .pth dans mon virtualenv, de sorte que je puisse importer des modules du paquetage tout en développant le code et en effectuant des tests (Question 1 : est-ce une bonne façon de faire ?). Cela fonctionne bien (voici un exemple, c'est le comportement que je veux) :

(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

Cependant, si j'essaie d'utiliser PyTest, je reçois des messages d'erreur d'importation :

(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

Je suis un peu perplexe, il semble que cela indique une erreur d'importation, mais Python le fait bien alors pourquoi y a-t-il un problème spécifique avec PyTest ? Une suggestion sur la raison / le remède (Question 2) ? J'ai cherché sur Google et fait un stack-overflow de l'erreur 'ImportError : cannot import' pour PyTest, mais les résultats que j'ai obtenus concernaient un chemin python manquant et un remède à cela, ce qui ne semble pas être le problème ici. Avez-vous des suggestions ?

234voto

Zorglub29 Points 970

J'ai trouvé la réponse :

NE PAS mettre un __init__.py dans un dossier contenant TESTS si vous prévoyez d'utiliser pytest. J'avais un tel fichier, le supprimer a résolu le problème.

C'était en fait enterré dans les commentaires de la deuxième réponse de Problème de PATH avec pytest 'ImportError : Pas de module nommé YadaYadaYada'. Je ne l'ai pas vu, j'espère qu'il sera plus visible ici.

141 votes

C'est drôle. J'ai eu le même problème et j'ai dû ajouter init .py dans mon dossier de tests.

15 votes

Oui, ce n'est pas une solution générale (même si c'était dans votre cas), pour comprendre pourquoi il faut lire ceci : docs.pytest.org/en/latest/goodpractices.html#test-package-name

19 votes

Cette information est erronée et trompeuse ! Après avoir ajouté init .py dans le dossier de test, tout fonctionne bien

178voto

Tom Points 8420

Je ne peux pas dire que je comprends pourquoi cela fonctionne, mais j'ai eu le même problème et les tests fonctionnent bien si j'exécute python -m pytest .

Je suis dans un virtualenv, avec pytest également disponible globalement :

(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

2 votes

Il a également fait le travail pour moi, le truc c'est qu'il est exécuté par la version de python définie au lieu de votre v.env.

39 votes

L'une des raisons pourrait être que python -m pytest [...] " ajoutera également le répertoire courant à sys.path ."

2 votes

J'ai eu le même problème sous Windows 10, et l'exécution de python -m pytest l'a résolu.

71voto

Aaron McMillin Points 384

Je viens de résoudre ce problème en supprimant le __init__.py dans mon projet Root :

.
 __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

12 votes

La réponse acceptée __init__.py file in a folder containing TESTS n'a pas résolu mon problème. Celui-ci a fonctionné. Je suppose que c'est à cause de la hiérarchie des fichiers.

1 votes

J'ai enlevé __init__.py fichier. J'étais toujours confronté au problème. L'ajout du fichier conftest.py dans le répertoire racine a fonctionné pour moi.

0 votes

Je m'attendrais à ce que conftest.py soit dans /tests et non dans la racine.

38voto

Mark Points 1278

J'ai eu le même problème mais pour une autre raison que celles mentionnées :

J'avais py.test installé globalement, alors que les paquets étaient installés dans un environnement virtuel.

La solution consistait à installer pytest dans l'environnement virtuel. (Au cas où votre interpréteur de commandes hacherait les exécutables, comme le fait Bash, utilisez hash -r ou utilisez le chemin complet vers py.test )

4 votes

Je viens de réaliser que j'avais le même problème sournois, en utilisant anaconda. J'ai oublié d'ajouter pytest dans le virtualenv créé par conda pourtant pytest il est disponible dans l'environnement racine d'anaconda. Par conséquent, pytest pourrait être trouvé, mais aucun paquet installé dans l'environnement.

3 votes

J'ai eu le même problème. pytest était installé globalement et non dans le virtualenv. pip3 install pytest dans le virtualenv a réglé le problème.

0 votes

Je l'avais même installé dans mon Venv mais pour une raison quelconque, il ne le captait pas. ( which pytest a montré la mauvaise version) Désactiver et réactiver le venv a tout arrangé.

13voto

lucasamaral Points 113

Ce problème se produira si vous avez un tests.py et un dossier de tests avec tests/__init__.py .

Pendant la collecte, pytest trouve le dossier, mais lorsqu'il essaie d'importer les fichiers de test à partir du dossier, tests.py causera le problème d'importation.

Pour réparer, il suffit de retirer le tests.py et placez tous vos tests dans le fichier tests/ dossier.

Pour votre cas spécifique, la solution sera précisément :

  • Supprimer le fichier /home/zz/Desktop/GitFolders/rc/tests.py
  • Assurez-vous que /home/zz/Desktop/GitFolders/rc/tests/__init__.py est présent

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X