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

问题描述 投票:0回答:1

我正在尝试为我们的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路径,并且每次都是相同的,所以它不是一个virtualenv问题:

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

python windows dll sqlite conda
1个回答
0
投票

通过在sys.path中查找解决方案,您正在查找错误的位置。你需要看看os.environ ['PATH']在这里的关键点是什么,因为它是Windows Loader选择了'错误'的DLL,错误的我指的是它根据其详细记录的DLL查找找到的第一个程序。

© www.soinside.com 2019 - 2024. All rights reserved.