12

我正在尝试使用 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 属性
  • 复制文件夹中的所有dll c:\windows\system32(重启机器完成)
  • 复制文件夹中的所有 dll c:\windows\sysWoW64(完成重启机器,这应该是 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

4 回答 4

2

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

以下是您可以尝试的方法(摘自此Google Groups 帖子):

  1. 将 spatialite dll(libgeos_c-1.dll、libgeos-3-0-0.dll、libproj-0.dll 和 libspatialite-2.dll)放入 C:/ 驱动器上的文件夹中。
  2. 将此文件夹添加到您的 PATH。

问题似乎是由于用户权限设置,Windows 可能无法从 C:\Windows\system32 加载 dll。

于 2012-06-08T21:11:19.330 回答
2

Python 中包含的版本sqlite3.dll似乎不想与 Spatialite 配合得很好。我唯一可以开始工作(没有从源代码编译所有内容)是:

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

有关更多信息,请参阅此博客文章

于 2015-11-12T08:50:31.230 回答
1

我最近刚刚经历了 pyspatialite 3.0.1 及其所有依赖库的 x64 构建的噩梦。这是可以做到的,但需要一些“调整”才能使其正确。

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

Pyspatialite 3.0.1 问题 #7 评论 #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 门票 #574

OSGEO GEOS TRAC 门票 #577

如果您从 577 下载这两个 makefile,它们会在 574 中包含修复程序。

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

最后,你需要对 geos/src/dirlist.mk 做一个小的修改:

在第 45 行,在 'simplify \' 下方和 '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 和 Python

作者进入的步骤没有涵盖让依赖库在 x64 位环境中工作的细节,但是,我发现它们并不是特别有用,因为 pyspatialite 3.0.1 现在自动检测适当版本的 spatialite 合并去下载。该站点上的示例代码创建了一个空间数据库文件,并在其中填充了数千个条目。一切对我来说都很顺利;所以我相信上面概述的方法来获得一个 pyspatialite x64 构建工作。

祝你好运!

-RMW混沌

于 2012-07-31T16:00:59.937 回答
0

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

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

于 2013-04-26T17:26:31.723 回答