web-dev-qa-db-fra.com

pytest ne peut pas importer le module alors que python peut

Je travaille sur un paquet en Python. J'utilise virtualenv. J'ai défini le chemin d'accès à la racine du module dans un chemin .pth de mon virtualenv, afin de pouvoir importer des modules du paquet tout en développant le code et en effectuant des tests (Question 1: est-ce un bon moyen de le faire?). Cela fonctionne bien (voici un exemple, voici 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. On dirait que cela indique une erreur d’importation, mais Python ne pose pas de problème. Pourquoi y at-il un problème spécifique à PyTest? Avez-vous des suggestions quant à la raison/solution (question 2)? J'ai googlé et dépassé la pile de l'erreur 'ImportError: impossible d'importer' pour PyTest, mais les hits que j'ai obtenus étaient liés au chemin manquant de Python et au remède à cela, ce qui ne semble pas être le problème ici. Aucune suggestion?

39
Zorglub29

Trouvé la réponse:

NE placez PAS un fichier __init__.py dans un dossier contenant TESTS si vous prévoyez d’utiliser pytest. J'ai eu un tel fichier, en le supprimant a résolu le problème.

Cela a en fait été enterré dans les commentaires de la deuxième réponse de Problème de PATH avec pytest 'ImportError: Aucun module nommé YadaYadaYada' donc je ne l'ai pas vu, j'espère qu'il obtiendra plus de visibilité ici.

49
Zorglub29

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 je lance python -m pytest.

Je suis dans un environnement virtuel, avec pytest également disponible dans le monde entier:

(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
13
Tom

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

Py.test était installé dans le monde entier, alors que les paquets étaient installés dans un environnement virtuel.

La solution consistait à installer pytest dans l'environnement virtuel. (Si votre shell hache les exécutables, comme Bash, utilisez hash -r ou utilisez le chemin d'accès complet à py.test)

7
Mark

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

.
├── __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
4
Aaron McMillin

Ce problème se produira si vous avez un fichier 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, le fichier tests.py pose le problème de l'importation.

Pour résoudre ce problème, supprimez simplement le fichier tests.py et placez tous vos tests dans le dossier tests/.

Pour votre cas spécifique, le correctif 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
3
lucasamaral

Installez les packages dans votre environnement virtuel.
Ensuite, démarrez un nouveau shell et sourcez à nouveau votre environnement virtuel.

2
Kjeld Flarup

Dans mon cas, l'erreur d'importation est survenue car le paquet pointe vers un autre paquet/répertoire avec le même nom et son chemin d'accès est au-dessus du dossier que je voulais réellement .Je pense que cela explique aussi pourquoi certaines personnes doivent supprimer _ init _.py, tandis que d'autres doivent rajouter. 

Je viens de mettre print(the_root_package.__path__) (après import the_root_package) dans les scripts python console et pytest pour comparer les différences _

BOTTOM LINE: lorsque vous modifiez python, le package que vous importez peut être différent de celui que vous utilisez lorsque vous exécutez pytest

2
JoeyZhao

La réponse ci-dessus ne fonctionne pas pour moi. Je viens de le résoudre en ajoutant le chemin absolu du module qui n’a pas été trouvé au sys.path en haut du test_xxx.py (votre module de test), comme ceci:

import sys
sys.path.append('path')
1
ZYX

Il se peut que Pytest ne lise pas le package en tant que module Python alors que Python l’est (probablement en raison de problèmes de chemin). Essayez de changer le répertoire du script pytest ou d’ajouter explicitement le module à votre PYTHONPATH.

Ou il se peut que vous ayez deux versions de Python installées sur votre ordinateur. Vérifiez votre source Python pour pytest et pour le shell Python que vous exécutez. Si elles sont différentes (par exemple, Python 2 vs 3), utilisez source activate pour vous assurer que vous exécutez le pytest installé pour le même python que celui dans lequel le module est installé.

0
tooty44

Avait un problème similaire et cela a fonctionné quand j'ai ajouté le fichier init. Py dans le répertoire tests.

0
Chetan G. Bendre

S'il est associé au code python initialement développé sous python 2.7 et migré maintenant vers python 3.x, le problème est probablement lié à un problème d'importation .

par exemple. lors de l'importation d'un objet à partir d'un fichier: base qui se trouve dans le même répertoire, cela fonctionnera dans python 2.x:

from base import MyClass

dans python 3.x, vous devez remplacer par base chemin complet ou .base si vous ne le faites pas, le problème ci-dessus sera résolu. alors essayez:

from .base import MyClass
0
Amit Talmor

J'ai eu un problème similaire, exactement la même erreur, mais une cause différente. J'exécutais le code de test très bien, mais par rapport à une ancienne version du module. Dans la version précédente de mon code, une classe existait, l'autre non. Après la mise à jour de mon code, j'aurais dû exécuter ce qui suit pour l'installer.

Sudo pip install ./ --upgrade

Lors de l'installation du module mis à jour, l'exécution de pytest produisait les résultats corrects (car j'utilisais le code de base correct).

0
Procyclinsur

Si vous avez déjà des fichiers .pyc, essayez de les supprimer.

Aujourd'hui, je rencontre ce problème, voici ce qui s'est passé:

j'exécute d'abord pytest sous mac (cela générera des fichiers pyc), puis je lance un conteneur docker (l'os est Alpine), avec le répertoire du projet monté, puis, lorsque j'essaie d'exécuter pytest dans un conteneur, ImportError se produit. après le nettoyage de tous les fichiers pyc, plus aucune erreur.

J'espère que cela peut être utile.

0
接口夏季

Pour tous ceux qui ont tout essayé et qui continuent à avoir des erreurs, j'ai un travail à faire.

Dans le dossier dossier dans lequel pytest est installé, accédez au dossier pytest-env.

Ouvrez le fichier pyvenv.cfg.

Dans le changement de fichier include-system-site-packages de false à true.

home = /usr/bin
include-system-site-packages = true
version = 3.6.6

J'espère que ça marche. N'oubliez pas de voter.

0
Charan Reddy

Un autre cas particulier:

J'ai eu le problème en utilisant tox. Donc, mon programme fonctionnait bien, mais unittests via tox n'arrêtait pas de se plaindre . Après avoir installé les paquetages (nécessaires au programme), vous devez également spécifier les paquets utilisés dans les unittests du fichier tox.ini. 

[testenv]
deps =
    package1
    package2 
...
0
martin.zaenker