docker 运行py.test时出现错误ImportMismatchError

rm5edbpk  于 2023-10-16  发布在  Docker
关注(0)|答案(8)|浏览(161)

当我在本地运行测试时,它工作得很好,但是在创建了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中的WORKCODE。

bqf10yzr

bqf10yzr1#

我已经通过删除test/目录下的所有 pycache pkg修复了它,问题是当我创建docker镜像时,它也会选择我所有的 pycache 和**.pyc* 文件,当测试运行时,它使用我的本地机器路径而不是docker容器中的路径。
结论:在创建Docker镜像之前,请清除**.pyc* 和 pycache 文件。

k2arahey

k2arahey2#

您可以使用.dockerignore文件来排除所有__pycache__文件夹发送到docker镜像上下文:
.dockerignore文件,不包括所有子文件夹中的__pycache__文件夹和*.pyc文件:

**/__pycache__
**/*.pyc
ttcibm8c

ttcibm8c3#

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

sqxo8psd

sqxo8psd4#

您可以设置环境变量PY_IGNORE_IMPORTMISMATCH=1来跳过此错误。在简单的情况下,比如在Docker容器内外运行测试,它应该是很好的。

qqrboqgw

qqrboqgw5#

删除所有.pyc文件。您可以通过find . -name \*.pyc -delete执行此操作

8aqjt8rx

8aqjt8rx6#

在coverage/fullcoverage/中找到__pycache__文件,这些文件隐藏在jupyter notebook等中。
只需导航到文件夹并使用rm -r __pyache__/。它会照顾你的Pytest。

bihw5rsg

bihw5rsg7#

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

j9per5c4

j9per5c48#

如果您正在从目录ROOT运行py.test FILE,请确保FILE位于ROOT下的某个位置。如果是ELSEWHERE,pytest可能会尝试从ELSEWHERE加载插件,并报告ImportMismatchError。这就是我的原因。将FILE复制到ROOT下修复了此问题。

相关问题