我在我的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上复制这一功能,但没有成功
我不知道会出什么问题。这也是第一次发生这种情况,我已经在这个项目上工作了一段时间,没有任何这样的问题。任何正确方向的帮助或指针,甚至我如何调试/复制这些都将非常感谢
您是否创建了init.py文件
如果删除init.py文件,Python将不再在该目录中查找子模块,因此导入模块的尝试将失败
init.py文件通常为空,但可用于以更方便的名称导出软件包的选定部分、保存方便的函数等
我已经追查到了这个问题。当我运行CI构建时,我没有碰撞版本。PyPI上的实时版本是0.4.4,我正在努力发布v0.5.0。但是,我没有在包中碰撞版本,所以当我构建轮子和sdist包时,它们被标记为0.4.4
现在,我试图通过使用
find-links
开关运行pip来解决这个问题然而,我不知道pip总是将PyPI上的包优先于本地二进制文件或SDist。因此,在我的CI服务器上,我正在构建轮子,但当我实际安装它们来运行单元测试时,pip从PyPI中删除了0.4.4,而没有使用新构建的包。这就是为什么会发生导入错误,因为我在这个版本中只添加了有问题的
is_package_installed
函数,而它在0.4.4中不存在升级版本修复了这个问题,因为pip无法在PyPI上找到0.5.0,并且被迫使用本地二进制文件
我觉得奇怪的是,它在所有平台上的行为方式都不一样,但我们现在就在这里
相关问题 更多 >
编程相关推荐