ImportMismatchError while 运行 tox
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'))
。
我不断回到 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
文件夹的效果相同,您也可以考虑。
编辑:
我已经克隆了您的项目,恐怕与 pytest
或 tox
无关。您的项目(导入)的结构很糟糕。
如果您应用以下规则,您应该会有所改进:
- 仅使用绝对导入(并坚持使用
- 如果不需要,请不要在 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
布局的文章:
当 运行 在 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 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
文件夹的效果相同,您也可以考虑。
编辑:
我已经克隆了您的项目,恐怕与 pytest
或 tox
无关。您的项目(导入)的结构很糟糕。
如果您应用以下规则,您应该会有所改进:
- 仅使用绝对导入(并坚持使用
- 如果不需要,请不要在 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
布局的文章: