运行 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.py
和C/D/main.py
。 Python 3 在源文件夹中不需要__init__.py
文件,但是在A/B
和C/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的主要内容,如果未能解决你的问题,请参考以下文章