Python在运行测试时导入了错误版本的sqlite

时间:2018-03-07 17:55:32

标签: python windows dll sqlite conda

我试图为我们的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上运行时,不得不跳过大量的测试。

1 个答案:

答案 0 :(得分:0)

通过在sys.path中寻找解决方案,您正在寻找错误的位置。您需要在此处查看os.environ ['PATH']的关键点,因为是Windows Loader选择了“错误的” DLL,错误的是我指的是它根据有据可查的DLL查找找到的第一个DLL。程序。