Python在Python3.6、3.7、3.8上运行,但在3.9上不运行

2024-10-03 06:18:52 发布

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

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

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

因此,源代码在openTSNE中,测试在tests文件夹中。我尝试从openTSNE.utils导入test_tsne.py 中的函数is_package_installed ,如下所示

from openTSNE.utils import is_package_installed

我在Mac、Windows和Linux上为所有版本的Python3.6-3.9构建轮子。我还在Linux上构建了一个sdist。我首先在每个CI VM上构建软件包,安装它,然后在安装的软件包上运行unittest套件

这就是设置。以下是绝对奇怪的部分: 一切都在我的控制盘OSX-py39、Win-py39和所有linux控制盘上运行。它在LinuxSDist版本、OSX-py36到py38或Win-py36到py38上不工作。请参阅CI生成日志 https://dev.azure.com/pavlingp/openTSNE/_build/results?buildId=359&view=logs&j=9adead4c-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上找到。{a2}和{a3}。我曾试图在本地的MacBook上复制这一功能,但没有成功

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


Tags: installedfrompytestimport版本cipackage
2条回答

您是否创建了init.py文件

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

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

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

我已经追查到了这个问题。当我运行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,并且被迫使用本地二进制文件

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

相关问题 更多 >