Python中的spaceite的Sqlite load_extension失败

时间:2011-12-21 13:31:44

标签: python sqlite spatialite

我正在尝试使用Spatialite beta版本3.0因为我正在使用 64位计算机上的Windows 7。

我尝试加载时始终遇到可怕的sqlite3.OperationalError: The specified module could not be found.错误 libspatialite-4.dll

我尝试了以下内容:

  • libspatialite-4.dll和所有其他dll放在同一个文件夹中
  • 使用dll的完整路径
  • 将dll位置添加到'PATH'环境变量
  • 将dll位置作为Python代码的一部分附加到sys.path属性
  • 复制c:\windows\system32文件夹中的所有dll(完成重启机器)
  • 复制c:\windows\sysWoW64文件夹中的所有dll(完成重启机器,这应该是32位dll,但我还是试过了)

我的代码如下:

import sqlite3
conn = sqlite3.connect(":memory:")
conn.enable_load_extension(True)
conn.execute('SELECT load_extension("libspatialite-4.dll")')

注意 - 我也尝试了完整的路径而没有运气。我记得有 与Windows XP 32位相同的问题。我让它工作但不能 记得我做了什么:(

更新

我在32位Windows 7上测试了设置,并将所有dll放在System32文件夹中。因此,这表明64位设置存在一些问题。难道我需要另一个版本的MSVC(我不认为Spatialite网站说哪个是必要的,所以我可能只需要猜测 - 我安装了MSVC2010)?

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,这让我困惑了好几天。我在Windows 7(x64)上运行Python 2.6(32位),因此它可能与您的设置不同。

以下是您可以尝试的内容(取自此Google Groups post):

  1. 将spatialite dll(libgeos_c-1.dll,libgeos-3-0-0.dll,libproj-0.dll和libspatialite-2.dll)放入C:/驱动器上的文件夹中。
  2. 将此文件夹添加到PATH。
  3. 问题似乎是由于用户权限设置,Windows可能无法从C:\ Windows \ system32加载dll。

答案 1 :(得分:1)

我刚刚经历了pyspatialite 3.0.1 x64版本及其所有依赖库的噩梦。它可以做到,但需要一些“调整”才能做到正确。

首先,请注意在此处编译spatialite.c amalgamation可能需要的解决方法:

Pyspatialite 3.0.1 Issue #7 Comment #3

其次,我建议您使用MSVC 2008 / SDK 7.0 x64进行编译,这是Python 2.7 x64的编译方式。当我使用mingw-w64编译依赖库时,我遇到了很多麻烦,试图编译正确的东西。

iconv(v.1.9.2)和proj4(v.4.8.0)似乎都编译并安装得很好;但是,使用最新的GEOS svn_trunk(v.3.3.5)可能会遇到麻烦。请注意以下关于变通方法/修复程序的链接......

OSGEO GEOS TRAC Ticket #574

OSGEO GEOS TRAC Ticket #577

如果从577下载两个makefile,则它们包含574中的修复程序。

您还需要下载其中一个夜间快照,并在编译之前将geos / src / triangulate目录复制到您的构建文件夹,因为它在svn_trunk中缺失。

最后,您需要对geos / src / dirlist.mk进行一些小修改:

在第45行,在“简化”下方和“util”上方添加“triangulate”(无引号)。

现在编译时,您可能会看到一些警告,但构建不应该彻底失败......

nmake /f makefile.vc PREFIX=../Path/To/Geos/Install/Here

nmake install /f makefile.vc PREFIX=../Path/To/Geos/Install/Here

它会处理你的lib依赖项。现在你需要做两件事之一:  1.在pyspatialite构建文件夹中创建setup.cfg文件并添加/ bin,/ lib和/ include路径,或者  2.直接编辑pyspatialite setup.py文件并执行相同的操作。

我发现直接编辑setup.py文件最简单,并将依赖库的路径添加到类似于:

(line 45) include_dirs = ['../usr/local/include', '../python27/include']

(line 46) library_dirs = ['../usr/local/lib', '../python27/libs', '../usr/local/bin', '../python27/DLLs']

(line 47) libraries = ['geos','geos_c','proj','iconv'] # You may need to add 'iconv' here

(line 48) runtime_library_dirs = ['../usr/local/lib', '../python27/libs', '../usr/local/bin', '../python27/DLLs']

如果在进行这些更改之后,pyspatialite仍然无法为您构建,请对setup.py进行一组修改:在第121行附近,添加以下行...

ext.include_dirs.append('../python27/include') 
ext.include_dirs.append('../usr/local/include') 

ext.library_dirs.append('../python27/libs')
ext.library_dirs.append('../usr/local/lib')

ext.library_dirs.append('../python27/DLLs')
ext.library_dirs.append('../usr/local/bin')

请记住替换路径以匹配您的特定设置。应该这样做。运行'python setup.py install'后,一切都应该有效。

你可以在../Python27/Lib/site-packages/pyspatialite/test中运行所有测试 - 它们都为我而传;但是,更好,更现实的测试可能是从此链接运行示例代码:

SpatiaLite and Python

作者进入的步骤没有详细介绍如何让依赖库在x64位环境中工作,但是我没有发现它们特别有用,因为pyspatialite 3.0.1现在自动检测到适当的版本下载的spaceite合并。站点上的示例代码创建一个spatialite数据库文件,并用数千个条目填充它。一切都为我成功;所以我相信上面概述的方法可以让pyspatialite x64构建起作用。

祝你好运!

-RMWChaos

答案 2 :(得分:1)

Python中包含的sqlite3.dll版本似乎并不想与Spatialite合作。我唯一可以上班的工作(没有从源头编译所有东西)是:

  1. 下载SQLite(或cyqlite - 重新编译SQLite for Windows并启用了一些方便的功能,例如R-Tree,以便您可以执行spaital索引),即sqlite-dll-win32-x86-[version].zip
  2. 下载mod_spatialite(Windows二进制文件位于页面底部的粉红色框中),即mod_spatialite-[version]-win-x86.7z
  3. 首先 SQLite / cyqlite 然后 mod_spatialite 解压缩到相同文件夹(如果有任何冲突,则覆盖)
  4. 将此文件夹添加到您的系统路径
  5. 将Python DLLs目录中的sqlite3.dll重命名为sqlite3_old.dll,以便Python在您的路径中使用新的<{li}>

    有关详细信息,请参阅this blog post

答案 3 :(得分:0)

我按照上一篇文章here中的说明解决了这个问题。根据上面的一些内容,我的系统是带有32位空间文件库的Win7 64位和用于python的pysqlite库。我链接到我的DLLs目录中的sqlite3.dll(这是ArcGIS安装的Python,与其他安装略有不同)。

这解决了通过pysqlite加载Spatialite 4 dll的问题。