【问题标题】:ImportMismatchError while running tox运行 tox 时出现 ImportMismatchError
【发布时间】:2020-07-21 09:11:52
【问题描述】:

在 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,如上述问题的答案中所建议的那样)。 非常欢迎任何提示或解决方案。

【问题讨论】:

  • 请分享你的 tox.ini
  • @J.G.我没有 tox.ini,但使用 setup.cfg。那里的 tox 配置是 [tox:tox] minversion = 3.7 skip_missing_interpreters = true envlist = py{38} recreate = true
  • 哇哦,我学到了新东西!谢谢!无论如何,您需要有一个testenv 部分,对吧?或者你如何运行测试?请使用所有相关的 tox 配置更新您的问题(格式正确时更易于阅读)
  • 没关系,我找到了你的仓库,克隆了它,让测试运行——除了一个失败。准备答案。

标签: python virtualenv importerror tox


【解决方案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/

【讨论】:

    【解决方案2】:

    在虚拟环境中使用 tox 运行我的测试时

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

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

    tox --recreate
    

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

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

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

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

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

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

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

    【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多