ImportMismatchError while 运行 tox

ImportMismatchError while running tox

当 运行 在 vi​​rtualenv 中使用 tox 进行测试时,我 运行 进入 py._path.local.LocalPath.ImportMismatchError: ('tfields.__main__', '/builds/dboe/tfields/.tox/py38/lib/python3.8/site-packages/tfields/__main__.py', local('/builds/dboe/tfields/tfields/__main__.py'))。 我不断回到 Getting error ImportMismatchError while running py.test but removing pycache and *.pyc does not solve my issue. See https://gitlab.mpcdf.mpg.de/dboe/tfields/-/jobs/1122409 以了解我的 ci 的失败示例(您可以在第 96 行和第 97 行中看到我按照建议删除了 pycache 和 *.pyc在上面提到的问题的答案中)。 非常欢迎任何提示或解决方案。

When running my tests with tox in a virtualenv

你真的不需要 运行 在虚拟环境中毒害。 Tox 创建一个 virtualenv 来安装你的项目。自动化工具通常为新 python 可执行文件提供标准化工具。

有时在重构项目之后;例如,更改项目文件夹结构会导致此问题。最好的补救措施通常就是简单地调用:

tox --recreate

总是在我的CI/CD中这样做。否则可能会使用缓存,这可能会导致这些构建的幂等性出现问题。

如果这不起作用,请检查您的构建代理是否正确清理了构建目录。它可能会留下其他构建的残余。

这与删除.tox文件夹的效果相同,您也可以考虑。

编辑: 我已经克隆了您的项目,恐怕与 pytesttox 无关。您的项目(导入)的结构很糟糕。

如果您应用以下规则,您应该会有所改进:

  • 仅使用绝对导入(并坚持使用
  • 如果不需要,请不要在 init 中添加导入
  • 使导入尽可能具体(显式优于隐式 < zen of python)

最后,某处发生了导入循环(例如 file1 导入 file2、file2 导入 file1)。但我会让你找到那个。

在您的 testenv 部分,您必须设置

setenv = PY_IGNORE_IMPORTMISMATCH=1

usedevelop = true

您可以在 pytest bugtracker 上阅读有关此问题的更多信息,请参阅此处 https://github.com/pytest-dev/pytest/issues/2042

虽然我没有在这上面花很多时间,但我很确定这与您的包的命名有关。

主源文件夹名为 tfields,您的包名为 tfields。问题是现在已安装的包和文件夹都可用于同一命名空间下的 Python。

如果我没记错的话,我的 https://github.com/jugmac00/hibpcli 项目遇到了同样的问题 - 一旦我将源代码放在 src 目录中,并且不再调用与包名相同的顶级文件夹。

如果您想深入挖掘,我强烈推荐 Hynek Schlawack 撰写的关于为什么使用 src 布局的文章:

https://hynek.me/articles/testing-packaging/