运行py.test时出现错误ImportMismatchError


72

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

@MarSoft / projects位于主目录中,/ apis位于docker的主目录中,顺便说一句,我已经解决了这个问题。谢谢!
AJ

Answers:


131

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

结论:在创建docker映像之前,请清除* .pyc__pycache__文件。


14
您可以将这些条目放在.dockerignore文件中,以便在构建阶段将其忽略。尽管如果您将源文件夹绑定安装在容器中,它们仍然会被拾取,但是为了在包含本地修改的同时运行测试。
giorgiosironi

要消除此问题,我必须__pycache__在文件的内部目录中报告该错误。谢谢。
h3xh4wk

6
Unix命令:find . \( -name '__pycache__' -or -name '*.pyc' \) -delete
bitoffdev

对于我的用例,我还必须将该build文件夹添加到.dockerignore
CNugteren

34

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

.dockerignore文件,不包括所有子文件夹中的文件__pycache__夹和*.pyc文件:

**/__pycache__
**/*.pyc

1
也可以是任何virtualenv/.venv或类似版本。
丹妮尔·马德利

12

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


2
这本质上是对@AJ答案的重写。如何使这增加了OP问题的价值?
Tedinoz

2
@Tedinoz可以轻松粘贴以解决此问题。不管喜欢与否,许多人都对解决方案感到满意,并且不想了解背景。
poroszd

10

我正在使用Python 3.6。就我而言,我ImportMismatchError在不同的包(例如A/B/main.py和)下进入了具有相同名称的模块C/D/main.py。Python 3不需要__init__.py源文件夹中的文件,而是__init__.py在下面添加A/BC/D解决了该问题。


我有同样的问题,您的回答也为我解决了。我不知道为什么要添加__init__.py修复它?我想了解...
Newskooler

2
@Newskooler添加__init__文件可以让python知道树中每个文件的绝对路径。没有这些文件,如果您在不同的文件夹下有两个以相同方式命名的不同文件,它将不会知道您要指的是哪个文件。
avazula

1
好的,因此即使“ Python 3不需要init .py”,如果您希望它正常运行,它还是需要它吗?
Newskooler

7

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


2

__pycache__在coverage / fullcoverage /中找到的文件被隐藏jupyter notebook等。

只需导航到该文件夹​​并使用即可rm -r __pyache__/。这将照顾您的pytest。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.