如何在CI上测试Python轮子

时间:2019-07-05 19:15:30

标签: python cython setuptools python-wheel

我正在Azure管道上运行测试(但同样的情况适用于Travis和Appveyor)。我有一个Python程序包,我们称它为calculator,其中包含cython扩展。当我推送到存储库时,CI服务器会克隆我的软件包并使用python setup.py develop安装它,然后运行pytest来运行测试。运行python setup.py develop可以在原位构建扩展,因此共享对象位于实际目录中。因此,当我的单元测试运行import calculator时,cwd是源目录,因此将使用python脚本的实际副本,该脚本包含共享的对象文件,因此一切正常。

现在,我想将python setup.py develop替换为python setup.py install。现在,扩展不再构建在当前源目录中,而是打包并安装到python路径中。但是,在安装后调用pytest时,python仍然可以在工作目录中找到calculator模块,并且(我想)会忽略正确安装的calculator模块。而且由于扩展不是在原地构建的,因此测试失败,提示未找到扩展模块。

我要这样做的原因是因为我还设置了要在CI服务器上构建的轮子。当我制造一个轮子时,我还要确保没有任何问题,然后安装该轮子并对其进行测试。与python setup.py install类似,我想工作目录中的calcualtor模块优先于我安装的转轮,并导致扩展名导入错误。

人们通常如何处理?

1 个答案:

答案 0 :(得分:0)

自发布此问题以来,我已经对此进行了相当多的阅读,该问题源于Python自动将工作目录添加到sys.path的事实。由于CI服务器将其工作路径设置为源目录,因此实际的源文件优先于已安装的库。有两种解决方案:

  1. 我们可以将包切换到src布局,这仅意味着将包含源文件的计算器包的典型约定从calculator重命名为src。这要求然后正确调整设置,并且src目录包含一个名为calculator的目录。我认为这很丑陋,所以我选择了更简单的选择
  2. 只需删除或重命名CI服务器上的源目录,以便在工作目录中找不到该软件包。在我的特定情况下,我只是在运行测试之前运行了mv calculator src