【问题标题】:Spatialite with Python 2 and 3使用 Python 2 和 3 的 Spatialite
【发布时间】:2015-04-20 15:13:36
【问题描述】:

我正在尝试在 Windows 7 上将spatialite 与 Python 2 和 3 一起使用。

我决定使用load_extension 方法和sqlite3 Python 内置包,而不是尝试为Python 3 修补pyspatialite,类似于这里的做法:Sqlite load_extension fail for spatialite in Python 和这里:Use spatialite extension for SQLite on Windows .

但是,在官方 (C)Python 2.7 安装程序中,load_extension 因与 MacOS 相关的问题而被禁用。这不是与 Python 3.4 对应的。此外,这两个安装程序都是在没有 SQLITE_ENABLE_RTREE=1 的情况下构建的(我也想拥有)。

起初,对于 Python 2.7,一种解决方法是构建 pysqlite,调整设置文件以同时具有 R*Tree 和扩展。这种方式不适用于 Python 3,因为当前的 setup.py 似乎不支持它。据我了解,这是因为包移动到了核心 Python 存储库:https://github.com/ghaering/pysqlite/issues/72#issuecomment-94319589

我当前的解决方案是使用 sqlite3 包的所需设置重新构建 Python 2.7 和 3.4。它起作用了,我能够将spatialite 作为扩展加载并创建 R*Tree。

是否存在替代的更简单解决方案?有人通过处理pyspatialitepysqlitesetup.pypysqlite 找到了替代解决方案吗?

【问题讨论】:

标签: python-2.7 python-3.x sqlite spatialite


【解决方案1】:

我刚刚开始使用一个更简单的解决方案。我正在使用默认 sqlite3 包和 Spatialite 4.3 运行带有 Python 3.5 的 Windows 10。

我就是这样做的:

让我们从一个加载 spatialite 扩展(我们还没有安装)的简单程序开始:

import sqlite3

with sqlite3.connect(":memory:") as conn:
    conn.enable_load_extension(True)
    conn.load_extension("mod_spatialite")

如果你运行这个程序,你会得到:

C:\> python test.py
Traceback (most recent call last):
  File "test2.py", line 5, in <module>
    conn.load_extension("mod_spatialite")
sqlite3.OperationalError: The specified module could not be found.

这意味着它找不到mod_spatialite 扩展名。让我们从Spatialite website 下载它。在底部有指向“MS Windows 二进制文件”的链接。我选择了 x86 版本,当前的稳定版本,并下载了名为 mod_spatialite-4.3.0a-win-x86.7z 的文件。将该文件解压缩到 test.py 文件所在的同一目录,现在运行程序不会产生任何错误(即它可以工作!):

C:\> python test.py
C:\> 

【讨论】:

  • 您提出的解决方案可能存在问题,因为您下载的二进制文件看起来是使用 Visual Studio 2010 构建的。这不是 Python 3.5+(也不是 2.7)的官方编译器。
  • 如果我偶然发现此方法的任何问题,我会报告。到目前为止,我已经成功连接到 spatialite,创建了所有元数据表并开始尝试使用 POINT 列。没有任何问题。
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2016-11-19
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多