在运行Tox时出现ImportMismatchError

时间:2020-07-21 09:11:52

标签: python virtualenv importerror 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'))。 我继续回到Getting error ImportMismatchError while running py.test,但是删除 pycache 和* .pyc无法解决我的问题。请参阅https://gitlab.mpcdf.mpg.de/dboe/tfields/-/jobs/1122409,了解我的ci的失败示例(您可以在第96和97行中看到,我按照上述问题的答案中的建议删除了 pycache 和* .pyc)。 任何提示或解决方案都非常欢迎。

2 个答案:

答案 0 :(得分:1)

在您的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/

答案 1 :(得分:0)

在virtualenv中使用tox运行测试时

您实际上并不需要在虚拟环境中运行Tox。 Tox创建一个virtualenv来将您的项目安装到其中。自动化工具通常为新的python可执行文件提供标准化工具。

有时会重构项目;例如,更改项目文件夹结构会导致这种情况。最好的补救方法通常是简单地调用:

tox --recreate

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

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

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

编辑: 我已经克隆了您的项目,这与pytesttox毫无关系。您的项目(导入)的结构相当混乱。

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

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

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