繁体   English   中英

运行 tox 时出现 ImportMismatchError

[英]ImportMismatchError while running tox

在 virtualenv 中使用 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')) 在运行 py.test 时不断返回出现错误 ImportMismatchError但删除pycache和 *.pyc 并不能解决我的问题。 有关我的 ci 的失败示例,请参阅https://gitlab.mpcdf.mpg.de/dboe/tfields/-/jobs/1122409 (您可以在第 96 行和第 97 行中看到我删除了 pycache和 *.pyc,如上面提到的问题的答案)。 非常欢迎任何提示或解决方案。

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

setenv = PY_IGNORE_IMPORTMISMATCH=1

或者

usedevelop = true

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

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

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

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

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

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

在 virtualenv 中使用 tox 运行我的测试时

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

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

tox --recreate

总是在我的 CI/CD 中这样做。 否则可能会使用缓存,这可能会给这些构建的幂等性带来麻烦。

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

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

编辑:我已经克隆了你的项目,它与pytesttox无关。 您的项目(进口)的结构相当破碎。

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

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

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

暂无
暂无

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

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