我正在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
模块优先于我安装的转轮,并导致扩展名导入错误。
人们通常如何处理?
答案 0 :(得分:0)
自发布此问题以来,我已经对此进行了相当多的阅读,该问题源于Python自动将工作目录添加到sys.path
的事实。由于CI服务器将其工作路径设置为源目录,因此实际的源文件优先于已安装的库。有两种解决方案:
src
布局,这仅意味着将包含源文件的计算器包的典型约定从calculator
重命名为src
。这要求然后正确调整设置,并且src
目录包含一个名为calculator
的目录。我认为这很丑陋,所以我选择了更简单的选择mv calculator src
。