2017-09-11 1 views
1

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. :)

+0

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

Répondre

0

Tout d'abord, vous devez simplement ajouter le répertoire racine à PYTHONPATH pas tous les fichiers de contexte. Deuxièmement, essayez d'utiliser des chemins relatifs à la place, si vous voulez importer le fichier de contexte du même dossier. Troisièmement, assurez-vous que tous les fichiers de contexte contiennent la variable que vous souhaitez importer.

+0

J'ai défini PYTHONPATH avant d'exécuter les scripts et cela a fonctionné. Merci d'avoir répondu. :) – Miranda