运行tox时发生ImportMismatchError

2024-03-29 06:06:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在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并不能解决我的问题。有关我的ci的失败示例,请参见https://gitlab.mpcdf.mpg.de/dboe/tfields/-/jobs/1122409(您可以在第96行和第97行中看到,我删除了pycache和*.pyc,如上面提到的问题的答案中所建议的)。 欢迎任何提示或解决方案


Tags: pathpytoxvirtualenvmainliblocalpyc
2条回答

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/

When running my tests with tox in a virtualenv

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

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

tox  recreate

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

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

这将与删除^ {< CD2>}文件夹相同,您也可以考虑。

编辑: 我克隆了你的项目,恐怕它与pytesttox都没有关系。项目(导入)的结构相当不完整

如果您应用了以下规则,您应该进行改进:

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

最后,在某个地方发生了一个导入循环(例如file1导入file2、file2导入file1)。但我会让你找到的

相关问题 更多 >