78 votes

Obtenir une erreur ImportMismatchError lors de l'exécution de py.test

Lorsque je lance des tests localement, tout fonctionne bien, mais après avoir créé le docker et exécuté à l'intérieur du conteneur, je reçois l'erreur suivante.

    /usr/local/lib/python3.5/site-packages/_pytest/config.py:325: in _getconftestmodules
    return self._path2confmods[path]
E   KeyError: local('/apis/db/tests')

Pendant la gestion de l'exception ci-dessus, une autre exception s'est produite :
/usr/local/lib/python3.5/site-packages/_pytest/config.py:356: in _importconftest
    return self._conftestpath2mod[conftestpath]
E   KeyError: local('/apis/db/tests/conftest.py')

Pendant la gestion de l'exception ci-dessus, une autre exception s'est produite :
/usr/local/lib/python3.5/site-packages/_pytest/config.py:362: in _importconftest
    mod = conftestpath.pyimport()
/usr/local/lib/python3.5/site-packages/py/_path/local.py:680: in pyimport
    raise self.ImportMismatchError(modname, modfile, self)

_pytest.config.ConftestImportFailure: ImportMismatchError('conftest', '/projects/my_project/db/tests/conftest.py', local('/apis/db/tests/conftest.py'))

/apis - c'est le WORKDIR dans le Dockerfile.

0 votes

Vous avez probablement des problèmes avec les chemins d'importation de python ou avec les liens symboliques ou autres. Qu'est-ce que /projects/my_project et qu'est-ce que /apis? Sont-ils des répertoires ou des liens symboliques? Comment sont-ils liés l'un à l'autre?

0 votes

@MarSoft /projets est dans le répertoire principal, et /apis est dans le répertoire principal de docker, au fait j'ai résolu le problème. Merci!

140voto

A J Points 2358

J'ai résolu le problème en supprimant tous les packages __pycache__ sous le répertoire test/, le problème était que lorsque je créais une image docker, il récupérait tous mes fichiers __pycache__ et *.pyc aussi, au moment où les tests sont exécutés, ils utilisent le chemin de ma machine locale au lieu du chemin dans le conteneur docker.

Conclusion : Nettoyez vos fichiers *.pyc et __pycache__ avant de créer une image docker.

14 votes

Vous pouvez mettre ces entrées dans votre fichier .dockerignore afin qu'elles soient ignorées lors de la phase de construction. Cependant, elles seraient toujours prises en compte si vous liez vos dossiers sources à l'intérieur du conteneur, afin d'exécuter des tests tout en incluant des modifications locales.

0 votes

Pour résoudre ce problème, j'ai dû localiser __pycache__ à l'intérieur du répertoire du fichier qui signalait cette erreur. Merci.

6 votes

Commande Unix : find . \( -name '__pycache__' -or -name '*.pyc' \) -delete

36voto

Datageek Points 2846

Vous pouvez utiliser le fichier .dockerignore pour exclure tous les dossiers __pycache__ de l'envoi vers le contexte de l'image docker :

Le fichier .dockerignore exclut les dossiers __pycache__ et les fichiers *.pyc de tous les sous-dossiers :

**/__pycache__
**/*.pyc

1 votes

Aussi tout virtualenv dans /.venv ou similaire.

16voto

phaedrus Points 8060

Je suis en train d'utiliser Python 3.6. Dans mon cas, j'obtenais une erreur ImportMismatchError dans des modules portant le même nom dans différents packages, par exemple, A/B/main.py et C/D/main.py. Python 3 ne nécessite pas de fichier __init__.py dans les dossiers source, mais ajouter __init__.py sous A/B et C/D a résolu le problème.

0 votes

J'ai le même problème et votre réponse l'a également résolu pour moi. Je me demande pourquoi l'ajout de __init__.py l'a résolu? J'essaie de comprendre...

2 votes

@Newskooler ajouter un fichier __init__ permet à Python de connaître le chemin absolu vers chaque fichier dans l'arborescence. Sans cela, si vous avez 2 fichiers différents portant le même nom sous des dossiers différents, il ne saura pas lequel vous faites référence.

1 votes

D'accord, donc essentiellement, même si "Python 3 ne nécessite pas de init.py", il a en quelque sorte besoin de cela si vous voulez qu'il fonctionne correctement ?

14voto

Abhilash Points 81

Supprimez tous les fichiers .pyc. Vous pouvez le faire en utilisant find . -name \*.pyc -delete

2 votes

Il s'agit essentiellement d'une réécriture de la réponse de @AJ. En quoi cela ajoute-t-il de la valeur à la question du demandeur ?

3 votes

@Tedinoz C'est un jeu d'enfant de copier-coller pour résoudre le problème. Que cela plaise ou non, de nombreuses personnes se contentent simplement d'une solution et ne veulent pas comprendre le contexte.

9voto

monitorius Points 133

Vous pouvez définir la variable d'environnement PY_IGNORE_IMPORTMISMATCH=1 pour ignorer ces erreurs. Cela devrait fonctionner dans des cas simples comme l'exécution de tests à l'intérieur et à l'extérieur du conteneur Docker.

0 votes

J'ai eu un problème similaire en exécutant pytest via tox via les actions GitHub. C'est la seule solution qui a fonctionné pour moi.

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