运行 py.test 时出现错误 ImportMismatchError

Posted

技术标签:

【中文标题】运行 py.test 时出现错误 ImportMismatchError【英文标题】:Getting error ImportMismatchError while running py.test 【发布时间】:2017-10-19 10:33:34 【问题描述】:

当我在本地运行测试时,它工作正常,但是在创建 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。

【问题讨论】:

您可能在 python 导入路径或符号链接或其他方面存在一些问题。什么是/projects/my_project,什么是/apis?它们是目录还是符号链接?它们之间有什么关系? @MarSoft /projects 在主目录中,/apis 在 docker 的主目录中,顺便说一句,我已经解决了这个问题。谢谢! 【参考方案1】:

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

结论:在创建 docker 镜像之前清除你的 *.pyc__pycache__ 文件。

【讨论】:

您可以将这些条目放在您的.dockerignore 文件中,以便在构建阶段忽略它们。尽管如果您将源文件夹绑定到容器内,它们仍然会被拾取,以便在包含本地修改的同时运行测试。 要消除这个问题,我必须在报告这个错误的文件目录中找到__pycache__。谢谢。 Unix 命令:find . \( -name '__pycache__' -or -name '*.pyc' \) -delete 对于我的用例,我还必须将 build 文件夹添加到 .dockerignore【参考方案2】:

您可以使用.dockerignore 文件将所有__pycache__ 文件夹排除在发送到docker 映像上下文之外:

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

**/__pycache__
**/*.pyc

【讨论】:

还有/.venv 或类似的任何virtualenv。【参考方案3】:

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

【讨论】:

我有同样的问题,你的回答也为我解决了。我想知道为什么添加__init__.py 会修复它?我正在努力理解... @Newskooler 添加一个__init__ 文件让python 知道指向树中每个文件的绝对路径。如果没有这些,如果您在不同的文件夹下有 2 个以相同方式命名的不同文件,它将不知道您指的是哪一个。 好的,所以基本上即使“Python 3 不需要 init.py”,如果您希望它正常运行,它确实需要它? 我有一个使用 python 3.8 的ImportPathMismatchError,这解决了问题。 我有一个使用 python 3.7 的ImportPathMismatchError,这解决了问题。【参考方案4】:

删除所有 .pyc 文件。你可以这样做 find . -name \*.pyc -delete

【讨论】:

这本质上是对@AJ 答案的重写。这如何为 OP 问题增加价值? @Tedinoz 你可以很容易地复制粘贴来解决问题。不管你喜不喜欢,很多人只是对解决方案感到满意,不想了解背景。【参考方案5】:

您可以设置环境变量PY_IGNORE_IMPORTMISMATCH=1 以跳过此错误。在简单的情况下应该没问题,比如在 docker 容器内外运行测试。

【讨论】:

我在通过 GitHub 操作通过 tox 运行 pytest 时遇到了类似的问题。这是唯一对我有用的解决方案。【参考方案6】:

在coverage/fullcoverage/中找到__pycache__文件,这些文件隐藏在jupyter notebook等中。

只需导航到文件夹并使用 rm -r __pyache__/ 。这将照顾你的 pytest。

【讨论】:

以上是关于运行 py.test 时出现错误 ImportMismatchError的主要内容,如果未能解决你的问题,请参考以下文章

运行查询以创建表时出现错误 1064?

尝试运行 jupyter notebook 时出现导入错误

运行时出现零错误

为啥在运行 jupyter notebook 时出现错误?

运行 php 文件时出现致命错误

使用 htdocs xampp 运行命令时出现以下错误