如何在 CI 上测试 Python 车轮
How to test Python wheels on CI
我正在 运行对 Azure Pipelines 进行测试(但同样的事情也适用于 Travis 和 Appveyor)。我有一个 Python 包,我们称它为 calculator
,其中包含 cython 扩展。当我推送到我的存储库时,CI 服务器克隆我的包并使用 python setup.py develop
安装它,然后 运行 pytest
到 运行 测试。 运行 python setup.py develop
就地构建扩展,因此共享对象位于实际目录中。因此,当我的单元测试 运行 import calculator
时,cwd 是源目录,因此使用 python 脚本的实际副本,其中包含共享对象文件,因此一切正常.
现在,我想用 python setup.py install
替换 python setup.py develop
。现在,扩展不再构建在当前源目录中,而是打包安装到 python 路径中。但是,当安装后调用 pytest 时,python 仍然可以在工作目录中找到 calculator
模块,并且(我猜)忽略了正确安装的 calculator
模块。并且因为扩展不是就地构建的,所以测试失败说找不到扩展模块。
我想这样做的原因是因为我还设置了要在 CI 服务器上构建的轮子。当我构建一个轮子时,我还想确保没有出错并安装那个轮子并在其上进行 运行 测试。与 python setup.py install
类似,我认为工作目录中的 calcualtor
模块优先于我安装的 wheel,并导致扩展导入错误。
人们通常如何处理这种情况?
自从发布这个问题以来,我已经阅读了很多这方面的内容,问题源于 Python 自动将工作目录添加到 sys.path
的事实。由于 CI 服务器将其工作路径设置为源目录,因此实际源文件优先于已安装的库。有两种解决方案:
- 我们可以将包切换为
src
布局,这意味着将包含源文件的计算器包的典型约定从 calculator
重命名为 src
。这需要正确调整设置,并且 src
目录包含一个名为 calculator
的目录。在我看来,这很丑陋,所以我选择了更简单的选项
- 只需删除或重命名CI服务器上的源目录,这样在工作目录下就找不到包了。在我的具体情况下,我只是 运行
mv calculator src
在 运行 我的测试之前。
我正在 运行对 Azure Pipelines 进行测试(但同样的事情也适用于 Travis 和 Appveyor)。我有一个 Python 包,我们称它为 calculator
,其中包含 cython 扩展。当我推送到我的存储库时,CI 服务器克隆我的包并使用 python setup.py develop
安装它,然后 运行 pytest
到 运行 测试。 运行 python setup.py develop
就地构建扩展,因此共享对象位于实际目录中。因此,当我的单元测试 运行 import calculator
时,cwd 是源目录,因此使用 python 脚本的实际副本,其中包含共享对象文件,因此一切正常.
现在,我想用 python setup.py install
替换 python setup.py develop
。现在,扩展不再构建在当前源目录中,而是打包安装到 python 路径中。但是,当安装后调用 pytest 时,python 仍然可以在工作目录中找到 calculator
模块,并且(我猜)忽略了正确安装的 calculator
模块。并且因为扩展不是就地构建的,所以测试失败说找不到扩展模块。
我想这样做的原因是因为我还设置了要在 CI 服务器上构建的轮子。当我构建一个轮子时,我还想确保没有出错并安装那个轮子并在其上进行 运行 测试。与 python setup.py install
类似,我认为工作目录中的 calcualtor
模块优先于我安装的 wheel,并导致扩展导入错误。
人们通常如何处理这种情况?
自从发布这个问题以来,我已经阅读了很多这方面的内容,问题源于 Python 自动将工作目录添加到 sys.path
的事实。由于 CI 服务器将其工作路径设置为源目录,因此实际源文件优先于已安装的库。有两种解决方案:
- 我们可以将包切换为
src
布局,这意味着将包含源文件的计算器包的典型约定从calculator
重命名为src
。这需要正确调整设置,并且src
目录包含一个名为calculator
的目录。在我看来,这很丑陋,所以我选择了更简单的选项 - 只需删除或重命名CI服务器上的源目录,这样在工作目录下就找不到包了。在我的具体情况下,我只是 运行
mv calculator src
在 运行 我的测试之前。