当我在本地运行测试时,它工作得很好,但是在创建了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。
8条答案
按热度按时间bqf10yzr1#
我已经通过删除test/目录下的所有 pycache pkg修复了它,问题是当我创建docker镜像时,它也会选择我所有的 pycache 和**.pyc* 文件,当测试运行时,它使用我的本地机器路径而不是docker容器中的路径。
结论:在创建Docker镜像之前,请清除**.pyc* 和 pycache 文件。
k2arahey2#
您可以使用.dockerignore文件来排除所有
__pycache__
文件夹发送到docker镜像上下文:.dockerignore
文件,不包括所有子文件夹中的__pycache__
文件夹和*.pyc
文件:ttcibm8c3#
我使用Python 3.6。在我的例子中,我在不同包下的同名模块中获取
ImportMismatchError
,例如A/B/main.py
和C/D/main.py
。Python 3不需要在源文件夹中添加__init__.py
文件,但在A/B
和C/D
下添加__init__.py
解决了这个问题。sqxo8psd4#
您可以设置环境变量
PY_IGNORE_IMPORTMISMATCH=1
来跳过此错误。在简单的情况下,比如在Docker容器内外运行测试,它应该是很好的。qqrboqgw5#
删除所有.pyc文件。您可以通过
find . -name \*.pyc -delete
执行此操作8aqjt8rx6#
在coverage/fullcoverage/中找到
__pycache__
文件,这些文件隐藏在jupyter notebook
等中。只需导航到文件夹并使用
rm -r __pyache__/
。它会照顾你的Pytest。bihw5rsg7#
在我的例子中,我手动将
PYTHONPATH
设置为我的repo的根。在这个文件夹中,我有一个worktrees/
文件夹,其中包含工作树,每个工作树都包含一个python包。由于我告诉python在我的repo的根目录下查找包,它也会考虑worktrees/
下的所有包,从而导致导入错误。我决定把这个嵌套结构扁平化。j9per5c48#
如果您正在从目录ROOT运行py.test FILE,请确保FILE位于ROOT下的某个位置。如果是ELSEWHERE,pytest可能会尝试从ELSEWHERE加载插件,并报告ImportMismatchError。这就是我的原因。将FILE复制到ROOT下修复了此问题。