运行 py.test 时获取错误 Import Mismatch Error

当我在本地运行测试时,它工作得很好,但是在创建了 docker 并在容器中运行之后,我得到了下面的错误。

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


During handling of the above exception, another exception occurred:
/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')


During handling of the above exception, another exception occurred:
/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-Dockerfile 的 WORkdir。

24365 次浏览

我已经通过删除 test/目录下的所有 _ _ pycache _ _ pkg 来修复它,问题是当我创建 docker 映像时,它也会选择我所有的 _ _ pycache _ _* . pyc文件,当 test 运行时,它使用我的本地机器路径而不是 docker 容器中的路径。

结论: 在创建 Docker 映像之前清除 * . pyc_ _ pycache _ _文件。

您可以使用 。多克忽略文件排除所有 __pycache__文件夹从被发送到多克图像上下文:

.dockerignore文件,从所有子/文件夹中排除 __pycache__文件夹和 *.pyc文件:

**/__pycache__
**/*.pyc

我正在使用 Python 3.6。在我的例子中,我将 ImportMismatchError放在不同包下的具有相同名称的模块中,例如 A/B/main.pyC/D/main.py。Python 3不需要源文件夹中的 __init__.py文件,但是在 A/BC/D下添加 __init__.py解决了这个问题。

删除所有的.pyc 文件 find . -name \*.pyc -delete

你可以设置环境变量 PY_IGNORE_IMPORTMISMATCH=1来跳过这个错误。在简单的情况下,比如在 Docker 容器内部和外部运行测试,应该没有问题。

发现 __pycache__文件在覆盖/完全覆盖/这是隐藏在 jupyter notebook等。

只需导航到文件夹并使用 rm -r __pyache__/

在我的情况下,我手动设置 PYTHONPATH到我的回购的根。在这个文件夹中,我有一个 worktrees/文件夹,其中包含工作树,每个工作树都包含一个 python 包。因为我告诉 python 在我的 repo 的根目录中查找包,所以它也会考虑 worktrees/下的所有包,从而导致导入错误。我决定把这个嵌套的结构弄平。