使用Python 2和3的Spatialite

7
我正在尝试在Windows 7上同时使用Python 2和3来使用spatialite。与其尝试为Python 3打补丁,我决定采用load_extension方法,并使用sqlite3 Python内置包,类似于这里的做法:Sqlite load_extension fail for spatialite in Python 和这里:Use spatialite extension for SQLite on Windows
但是,在官方(C)Python 2.7安装程序中,由于与MacOS相关的问题,load_extension被禁用了。这在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 我的当前解决方案是重新构建Python 2.7和3.4,并设置所需的sqlite3软件包。这种方法奏效了,我能够将spatialite作为扩展程序加载并创建R*Tree。
是否存在其他更简单的替代方案?是否有人通过修改pyspatialitepysqlitesetup.py找到了替代方案?

问题已在此处报告:https://github.com/ghaering/pysqlite/issues/72 - gmas80
1个回答

4

我刚刚找到了一种更简单的解决方案。我正在使用默认的sqlite3包和Spatialite 4.3,在Windows 10上运行Python 3.5。

这是我的做法:

首先,让我们编写一个简单的程序来加载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 binaries”的链接。我选择了x86版本的当前稳定版,并下载了名为mod_spatialite-4.3.0a-win-x86.7z的文件。将该文件解压到与您的test.py文件相同的目录中,现在运行程序不会产生任何错误(即它能正常工作!):

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

你提出的解决方案可能存在问题,因为看起来你下载的二进制文件是使用Visual Studio 2010构建的。这不是Python 3.5+(也不是2.7)的官方编译器。 - gmas80
如果我在使用这种方法时遇到任何问题,我会回报告的。到目前为止,我已成功连接到Spatialite,创建了所有元数据表,并开始尝试使用点列进行实验。一切都没有出现任何问题。 - Emil Stenström

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接