运行py.test时获取错误ImportMismatchError

A J*_*A J 58 python pytest docker

当我在本地运行测试时它的工作正常,但是在创建了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'))
Run Code Online (Sandbox Code Playgroud)

/ apis - 它是Dockerfile中的WORKDIR.

A J*_*A J 110

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

结论:在创建docker镜像之前清除*.pyc__pycache__文件.

  • 您可以将这些条目放在`.dockerignore`文件中,以便在构建阶段忽略它们.虽然如果将源文件夹绑定到容器中,它们仍然会被拾取,以便在包含本地修改的同时运行测试. (12认同)
  • Unix命令:`find。\(-name'__pycache__'-or -name'* .pyc'\)-删除` (5认同)

Dat*_*eek 25

您可以使用.dockerignore文件排除__pycache__发送到docker镜像上下文的所有文件夹:

.dockerignore文件,从所有子/文件夹中排除__pycache__文件夹和*.pyc文件:

**/__pycache__
**/*.pyc
Run Code Online (Sandbox Code Playgroud)


ami*_*mit 14

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

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

mon*_*ius 8

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


小智 7

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

  • 这本质上是对@AJ答案的重写。如何使这增加了OP问题的价值? (2认同)
  • @Tedinoz 很简单,您可以通过复制粘贴来解决问题。不管喜欢与否,许多人只是对解决方案感到满意而不想了解背景。 (2认同)