我试图为我们的Jenkins服务器设置一个Windows奴隶,但是由于sqlite错误,一些单元测试失败了。
我们正在使用conda,并已构建包含rtree的自定义版本的sqlite。然后我们的应用程序使用此自定义sqlite构建。当我们在Windows服务器上安装我们的应用程序时,安装了正确版本的sqlite:
$ conda list
sqlite 3.16.2 vc9_0 [vc9] file://[package_server]
从命令行运行应用程序它按预期工作。当我们运行测试时,
$ nosetests test
...
======================================================================
ERROR: test_vectorise_1 (test.system_test_wallet.test_rasters.test_vectorise.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "farm\rasters\vectorise.py", line 189, in run_vectorise
proc(progressfn)
File "farm\process.py", line 1278, in __call__
for feature in lyr:
File "C:\bin\Miniconda2\envs\farm_system_test_windows\lib\site-packages\osgeo\
ogr.py", line 2876, in next
feature = self.GetNextFeature()
File "C:\bin\Miniconda2\envs\farm_system_test_windows\lib\site-packages\osgeo\
ogr.py", line 1460, in GetNextFeature
return _ogr.Layer_GetNextFeature(self, *args)
RuntimeError: sqlite3_exec(CREATE VIRTUAL TABLE "rtree_GB_TEST_RP100_VE_5m_27700
_geom" USING rtree(id, minx, maxx, miny, maxy)) failed: no such module: rtree
我添加了一些日志来显示python可执行路径和sqlite3路径,每次都是一样的,所以它不是一个虚拟问题:
C:\bin\Miniconda2\envs\farm_system_test_windows\python.exe
C:\bin\Miniconda2\envs\farm_system_test_windows\lib\sqlite3\__init__.pyc
打印sqlite版本虽然显示出一些差异:
print('sql ver', sqlite3.sqlite_version_info)
从命令行运行应用程序,得到(3,16,2),这是正确的版本。运行nosetests,你得到(3,8,11) - 一个较旧的版本,可能是没有找到rtree的原因。
奇怪的是,如果你用
调用一个测试文件python path/to/test.py
让unittest做它的东西,最初导入版本(3,16,2),但是当测试运行时,你得到(3,8,11)和测试错误。
这里发生了什么?为什么我会根据我调用应用程序的方式获得不同版本的sqlite?
我在Windows Server 2012 R2上使用python 2.7.14,conda 4.4.11。
更新: 我仍然在Jenkins上获得此错误,现在也在我的开发机器上。它不仅仅是一个鼻子问题,因为当我使用unittest运行测试时,我得到了错误。 PYTHONPATH和sys.path在两种情况下都是相同的,并且调用堆栈是相同的,除了使用unittest之外,顶部还有两个帧。
File "C:\ProgramData\Anaconda2\envs\farm\lib\runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "C:\ProgramData\Anaconda2\envs\farm\lib\runpy.py", line 72, in _run_code
exec code in run_globals
有趣的是,调用堆栈的其余部分显示了main.py的绝对路径,入口点以及使用unittest时其他所有内容的相对路径。但是,当直接调用main.py时,main.py有一个相对路径,所有其他文件都有绝对路径。
有谁知道为什么我们会看到这种差异?当我们在Windows上运行时,不得不跳过大量的测试。
答案 0 :(得分:0)
通过在sys.path中寻找解决方案,您正在寻找错误的位置。您需要在此处查看os.environ ['PATH']的关键点,因为是Windows Loader选择了“错误的” DLL,错误的是我指的是它根据有据可查的DLL查找找到的第一个DLL。程序。