【问题标题】:Sqlite load_extension fail for spatialite in PythonSqlite load_extension 在 Python 中的空间站点失败
【发布时间】:2011-12-21 13:31:43
【问题描述】:

我正在尝试使用 Spatialite 测试版 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)?

【问题讨论】:

  • 刚刚检查了该线程,Cedric - 我在搜索中错过了它。尽管我使用的是 Python 而不是 C#,但我也使用了 64 位 beta 版本,该版本是从那时起新的。我肯定有该线程中列出的所有 dll,所以那里的解决方案不能解决我的问题。

标签: python sqlite spatialite


【解决方案1】:

我遇到了同样的问题,这让我困惑了好几天。我在 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。

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

【讨论】:

    【解决方案2】:

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

    1. 下载SQLite(或cyqlite - 为Windows 重新编译SQLite,启用了一些方便的功能,例如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. 将 Python DLLs 目录中的 sqlite3.dll 重命名为 sqlite3_old.dll,以便 Python 将在您的路径中使用新的名称

    请参阅this blog post 了解更多信息。

    【讨论】:

      【解决方案3】:

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

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

      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 行,在 '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 and Python

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

      祝你好运!

      -RMWChaos

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-03-19
          • 1970-01-01
          • 1970-01-01
          • 2015-12-27
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          • 2011-03-20
          • 2017-08-23
          相关资源
          最近更新 更多