Je crée une structure de répertoire en python qui est similaire à ceci:ImportError: ne peut pas importer nom lors de l'utilisation pytest
module_root
├── __init__.py
├── module_a
│ ├── __init__.py
│ ├── local_module_a.py
│ └── tests
│ ├── context.py
│ └── test_local_module_a.py
├── module_b
│ └── tests
│ └── context.py
├── tests
│ ├── context.py
│ └── test_this_module_will_be_exported.py
├── this_module_will_be_exported.py
└── this_module_will_not_be_exported.py
Chaque module a son propre dossier de test avec leurs tests. Une fois que Python ne recherche pas les modules dans les répertoires ci-dessus fichier appelant import
, chaque répertoire de test a un fichier appelé context.py
qui est semblable à:
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from this_module_will_be_exported import ThisClassWillBeExported
Puis, à l'intérieur de chaque fichier de test, j'utilise l'instruction d'importation suivante:
from context import ThisClassWillBeExported
Tout fonctionne bien quand je n'ai qu'un test
répertoire avec un context.py
, mais comme j'ajouter d'autres tests (comme décrit dans l'arborescence des répertoires ci-dessus), l'exécution pytest
renvoie l'erreur suivante.
ImportError while importing test module 'path/to/module_root/tests/test_this_module_will_be_exported.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
module_root/tests/test_this_module_will_be_exported.py:1: in <module>
from context import ThisClassWillBeExported
E ImportError: cannot import name 'ThisClassWillBeExported'
Quand je change le nom de module_root/module_a/tests/context.py
-module_root/module_a/tests/_context.py
(par exemple), les tests fonctionnent bien. Donc, je sais que je peux simplement changer tout context.py
à des noms différents, mais je veux garder leur nom pour éviter plus de travail.
J'ai donc besoin d'aide de la communauté, il y a un moyen de garder le nom context.py
et résoudre ce problème?
Merci. :)
Il se peut que ce soit parce que vous importez des classes portant le même nom dans votre espace de travail actuel. Peut-être que vous devriez l'essayer avec un chemin complet, par exemple; importer module_a.tests.context au lieu de la classe d'importation du module. – Vinny