Je travaille sur un package en Python. J'utilise virtualenv. J'ai défini le chemin vers la racine du module dans un chemin .pth dans mon virtualenv, afin de pouvoir importer les modules du package tout en développant le code et faire des tests (Question 1: est-ce une bonne façon de faire?). Cela fonctionne bien (voici un exemple, c'est le comportement que je souhaite):
(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, j'obtiens 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 fonctionne bien, alors pourquoi y a-t-il un problème spécifiquement avec PyTest? Une suggestion sur la raison / le remède (question 2)? J'ai cherché sur Google et j'ai débordé la pile de l'erreur `` ImportError: can't import '' pour PyTest, mais les hits que j'ai obtenus étaient liés au chemin python manquant et à y remédier, ce qui ne semble pas être le problème ici. Aucune suggestion?
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 cours
python -m pytest
.Je suis dans un virtualenv, avec pytest également disponible dans le monde:
la source
python -m pytest [...]
«ajoutera également le répertoire courantsys.path
».python3 -m pytest
PYTHONPATH=.:./src pytest
comme cible de création .Je viens de résoudre ce problème en supprimant le __init__.py dans la racine de mon projet:
la source
__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.__init__.py
fichier. J'étais toujours confronté à un problème. L'ajout du fichier conftest.py au répertoire racine a fonctionné pour moi.J'ai eu le même problème mais pour une autre raison que celles mentionnées:
J'ai installé py.test globalement, tandis que les packages ont été installés dans un environnement virtuel.
La solution consistait à installer
pytest
dans l'environnement virtuel. (Si votre shell hache les exécutables, comme le fait Bash, utilisezhash -r
ou utilisez le chemin complet verspy.test
)la source
pytest
le virtualenv créé parconda
, maispytest
il est disponible dans l'environnement racine d'anaconda. Par conséquent, pytest a pu être trouvé, mais aucun package installé dans l'environnement.pip3 install pytest
à l'intérieur de virtualenv a résolu le problème.Ce problème se produira si vous avez un
tests.py
fichier et un dossier de tests avectests/__init__.py
.Pendant la collecte, pytest trouve le dossier, mais lorsqu'il essaie d'importer les fichiers de test à partir du dossier, le
tests.py
fichier provoque le problème d'importation.Pour réparer, supprimez simplement le
tests.py
fichier et mettez tous vos tests dans letests/
dossier.Pour votre cas spécifique, le correctif sera précisément:
/home/zz/Desktop/GitFolders/rc/tests.py
/home/zz/Desktop/GitFolders/rc/tests/__init__.py
c'est présentla source
J'ai eu un problème similaire, exactement la même erreur, mais une cause différente. J'exécutais très bien le code de test, mais contre une ancienne version du module. Dans la version précédente de mon code, une classe existait, tandis que l'autre n'existait pas. Après avoir mis à jour 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 a produit les résultats corrects (car j'utilisais la base de code correcte).
la source
pip install ./ --upgrade
mis à jour la version installée de la bibliothèque avec le dernier code et a activé pytest pour trouver cette dernière version également.Dans mon cas, l'erreur d'importation s'est produite car le package pointe vers un autre package / répertoire avec le même nom et son chemin est un niveau au-dessus du dossier que je voulais réellement. Je pense que cela explique également pourquoi certaines personnes doivent supprimer _ init _.py tandis que d'autres doivent rajouter.
Je viens de mettre
print(the_root_package.__path__)
(aprèsimport the_root_package
) à la fois lapython
console et lespytest
scripts pour comparer la différenceLIGNE INFERIEURE: lorsque vous le faites
python
, le package que vous importez peut être différent du package lorsque vous exécutezpytest
.la source
Installez les packages dans votre environnement virtuel.
Ensuite, démarrez un nouveau shell et créez à nouveau votre environnement virtuel.
la source
La réponse ci-dessus ne fonctionne pas pour moi. Je viens de le résoudre en ajoutant le chemin absolu du module qui ne se trouve pas
sys.path
en haut detest_xxx.py
(votre module de test), comme:la source
test_main.py
, je l'ai misconftest.py
dans mon répertoire de test, et cela a fonctionné. Merci de fournir une solution programmatique, au lieu de la litière de fichiers.S'il est lié au code python initialement développé en python 2.7 et maintenant migré 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 en python 2.x:dans python 3.x, vous devez remplacer par
base
le chemin complet ou.base
ne pas le faire causera le problème ci-dessus. alors essayez:la source
Je rencontrais ce problème aujourd'hui et je l'ai résolu en appelant à
python -m pytest
partir de la racine de mon répertoire de projet.Appeler
pytest
depuis le même endroit posait toujours des problèmes.Mon répertoire de projet est organisé comme:
Le module a
routes
été importé dans my entest_routes.py
tant que:from server.routes.routes import Routes
J'espère que cela pourra aider!
la source
Un autre cas particulier:
J'ai eu le problème en utilisant tox. Donc mon programme a bien fonctionné, mais unittests via tox a continué à se plaindre. Après avoir installé les packages (nécessaires pour le programme), vous devez en plus spécifier les packages utilisés dans les unittests dans le fichier tox.ini
la source
J'obtenais cela en utilisant VSCode. J'ai un environnement conda. Je ne pense pas que l'extension python VScode puisse voir les mises à jour que je faisais.
Je devais courir
pip install ./ --upgrade
la source
Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Modifiez votre conftest.py et ajoutez les lignes de code suivantes:
Et si vous essayez d'exécuter le scénario de test via le terminal, utilisez l'exemple suivant:
la source
NameError: name 'file' is not defined
- à quoi le fichier doit-il être égal?Encore une autre victoire massive pour le système d'importation de Python. Je pense que la raison pour laquelle il n'y a pas de consensus est que ce qui fonctionne dépend probablement de votre environnement et des outils que vous utilisez en plus.
J'utilise ceci à partir de VS Code, dans l'explorateur de tests sous Windows dans un environnement conda, Python 3.8.
La configuration que je dois travailler est:
Dans cette configuration, intellisense fonctionne, de même que la découverte de test.
Notez que j'ai initialement essayé ce qui suit, comme recommandé ici .
Je ne pouvais trouver aucun moyen de faire fonctionner cela à partir de VS Code parce que le
src
dossier a tout simplement époustouflé l'esprit du système d'importation. J'imagine qu'il existe un moyen de faire fonctionner cela à partir de la ligne de commande. En tant que converti relativement nouveau à la programmation Python, cela me donne un sentiment nostalgique de travailler avec COM, mais un peu moins amusant.la source
Mes 2 centimes sur ceci: pytest échouera au hasard si vous n'utilisez pas d'environnements virtuels. Parfois, cela fonctionnera, parfois non.
Par conséquent, la solution est:
Le code, à l'aide de Windows PowerShell:
Puis finalement
Un exemple de setup.py, pour pip install -e:
la source
Je ne suis pas d'accord avec les articles disant que vous devez supprimer tous les
__init__.py
fichiers. Ce que vous devez faire à la place est de modifier le fichiersys.path
.Exécutez une expérience où vous imprimez
sys.path
lorsque vous exécutez le code normalement. Puis imprimezsys.path
tout en exécutant le code via pytest. Je pense que vous constaterez qu'il y a une différence entre ces deux chemins, d'où la rupture de pytest.Pour résoudre ce problème, insérez le chemin de la première expérience au 0ème index de la seconde.
Soit
'/usr/exampleUser/Documents/foo'
le premier élément deprint(sys.path)
pour l'expérience 1.Voici le code qui devrait résoudre votre problème:
import sys sys.path[0] = '/usr/exampleUser/Documents/foo'
Mettez-le en haut de votre fichier, avant votre déclaration d'importation réelle.
Source: Je m'occupais de cela moi-même et le processus ci-dessus l'a résolu.
la source
Tout gardé de la même manière et vient d'ajouter un fichier de test vide dans le dossier racine .. Résolu
Voici les résultats, ce problème m'a vraiment dérangé pendant un certain temps. Ma structure de dossiers était
et pytest se plaindrait de ModuleNotFoundError et donne le CONSEIL - assurez-vous que vos modules / packages de test ont des noms Python valides.
J'ai introduit un fichier de test simulé au même niveau que le répertoire mathsapp et tests. Le fichier ne contenait rien. Maintenant, Pytest ne se plaint pas.
Résultat sans le fichier
Résultats avec le fichier
la source
J'ai résolu mon problème en définissant les
PYTHONPATH
variables d'environnement pour la configuration spécifique avec laquelle j'exécute mes tests.Pendant que vous visualisez le fichier de test sur PyCharm:
Ctrl
+Shift
+A
Edit Configurations
PYTHONPATH
sous Environnement> Variables d'environnement.la source
Mettez simplement un
conftest.py
fichier vide dans le répertoire racine du projet, car quand ilpytest
découvre un conftest.py, il modifie sys.path afin qu'il puisse importer des éléments duconftest
module. Une structure générale de répertoires peut être:la source
J'ai eu un problème similaire et cela a fonctionné lorsque j'ai ajouté un
__init__.py
fichier sous le répertoire de tests.la source
Il se peut que Pytest ne lit pas le package en tant que module Python alors que Python le fait (probablement en raison de problèmes de chemin). Essayez de changer le répertoire du script pytest ou d'ajouter le module explicitement à votre PYTHONPATH.
Ou il se peut que vous ayez deux versions de Python installées sur votre machine. Vérifiez votre source Python pour pytest et pour le shell python que vous exécutez. S'ils sont différents (par exemple Python 2 vs 3), utilisez
source activate
pour vous assurer que vous exécutez le pytest installé pour le même python dans lequel le module est installé.la source
Pour tous ceux qui ont tout essayé et qui ont encore des erreurs, j'ai une solution.
Dans le dossier où pytest est installé , accédez au dossier pytest-env .
Ouvrez le fichier pyvenv.cfg .
Dans le fichier, changez include-system-site-packages de false à true .
J'espère que ça marche. N'oubliez pas de voter.
la source
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é:
Je lance d'abord pytest dans mac (cela générera des fichiers pyc), puis je lance un conteneur docker (l'os est alpin), avec le répertoire du projet monté, puis lorsque j'essaye d'exécuter pytest dans le conteneur, ImportError se produit. après avoir nettoyé tous les fichiers pyc, plus aucune erreur.
J'espère que cela peut être utile.
la source
si vous avez besoin d'un fichier init .py dans votre dossier, faites une copie du dossier et supprimez init .py dans celui-ci pour exécuter vos tests, cela fonctionne pour les projets locaux. Si vous avez besoin d'exécuter des tests régulièrement, voyez si vous pouvez déplacer votre init .py vers un fichier séparé.
la source
[Résolu] Avant de passer directement à la solution de suppression / ajout
__init__.py
, nous pourrions également vouloir regarder comment les importations sont effectuées dans vos classes. En fait, j'ai perdu une journée à jouer en__init__.py
pensant que c'était peut-être le problème :) Cependant, c'était assez instructif.Dans mon cas, c'était la mauvaise façon d'appeler des classes d'une classe python vers une autre classe python qui lançait
ImportError
. Correction de la façon dont les classes / modules étaient appelés et cela fonctionnait comme un charme. J'espère que cela aide aussi les autres.Et oui, pour une erreur similaire, nous pourrions avoir des solutions différentes selon la façon dont le code est écrit. Mieux vaut passer plus de temps sur l'auto-débogage. Leçon apprise :) Bon codage !!!
la source
Dans mon cas, je travaille dans un conteneur et malheureusement pytest a tendance à utiliser python2.7 plutôt que mon interpréteur python3 de choix.
Dans mon cas, cela a fonctionné:
Ma structure de dossiers
la source
J'avais placé tous mes tests dans un dossier de tests et recevais la même erreur. J'ai résolu cela en ajoutant un init .py dans ce dossier comme ceci:
la source