繁体   English   中英

运行 py.test 时出现错误 ImportMismatchError

[英]Getting error ImportMismatchError while running py.test

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

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

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

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

.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 find . -name \*.pyc -delete

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM