Python 3.6、3.7、3.8上的Python ImportError,但3.9上没有

  • 本文关键字:Python 上的 ImportError python
  • 更新时间 :
  • 英文 :


我在CI上遇到了一个奇怪的导入错误,我无法在本地复制,也不知道如何处理。我为我的CI使用Azure管道,并运行构建矩阵为我的包构建轮子。一切都按预期建造。今天,我想发布一个新版本,我对代码做了一些更改。我的文件结构是

openTSNE/
__init__.py
utils.py
tests/
test_tsne.py
setup.py

因此源在CCD_ 1中,而测试在tests文件夹中。我试图像一样从openTSNE.utils导入test_tsne.py中的函数is_package_installed

from openTSNE.utils import is_package_installed

我在Mac、Windows和Linux上为所有版本的Python 3.6-3.9构建轮子。我还在Linux上构建了一个sdist。我首先在每个CIVM上构建软件包,安装它,然后在安装的软件包上运行我的单元测试套件。

这就是设置。这是一个非常奇怪的部分:一切都在我的轮子OSX-py39、Win-py39和所有linux轮子上运行。它在Linux sdist版本、OSX-py36到py38或Win-py36到py三十八上不起作用。请参阅CI生成日志https://dev.azure.com/pavlingp/openTSNE/_build/results?buildId=359&view=日志&j=9ad4c-7271--5cd3-b143-2c28e08460f5&t=9572adb2-9d5f-5130-5c60-5fd15aeb658c

测试失败

tests/test_tsne.py:19: in <module>
from openTSNE.utils import is_package_installed
ImportError: cannot import name 'is_package_installed'

源代码可以在GH上找到。函数和违规测试。我曾试图在我当地的MacBook上复制这个,但没有成功。

我不知道可能出了什么问题。这也是第一次发生这种情况,我已经在这个项目上工作了一段时间,没有遇到任何这样的问题。任何指向正确方向的帮助或指针,甚至我如何调试/复制这一点,都将非常感激。

我已经找到了这个问题。当我运行CI构建时,我没有更改版本。PyPI上的实时版本是0.4.4,我正在发布v0.5.0。然而,我没有在包中修改版本,所以当我构建轮子和sdist包时,它们被标记为0.4.4。

现在,我试着用--find-links开关运行pip来绕过这个问题

pip install --user --force-reinstall --find-links dist openTSNE

然而,我不知道pip将始终优先考虑PyPI上的包,而不是本地二进制文件或sdist。所以,在我的CI服务器上,我正在构建轮子,但当我真正安装它们来运行单元测试时,pip从PyPI中降低了0.4.4,并且没有使用新构建的包。这就是发生导入错误的原因——我在这个版本中只添加了有问题的is_package_installed函数,而它在0.4.4中不存在。

修改版本解决了这个问题,因为pip在PyPI上找不到0.5.0,被迫使用本地二进制文件。

奇怪的是,它在所有平台上的行为都不一样,但我们现在在这里。

是否创建了init.py文件?

openTSNE/
utils.py/
__init__.py
tests/
test_tsne.py
setup.py

如果删除init.py文件,Python将不再在该目录中查找子模块,因此导入模块的尝试将失败。

init.py文件通常是空的,但可以用来以更方便的名称导出包的选定部分,保存方便的函数等。

最新更新