【问题标题】:Getting error ImportMismatchError while running py.test运行 py.test 时出现错误 ImportMismatchError
【发布时间】: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 的主目录中,顺便说一句,我已经解决了这个问题。谢谢!

标签: python docker pytest


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多