Spatialite с Python 2 и 3

Я пытаюсь использовать spatialite как с Python 2, так и с 3 в Windows 7.

Вместо того, чтобы пытаться исправить pyspatialite для Python 3, я решил использовать подход load_extension со встроенным пакетом sqlite3 Python, подобно тому, как это делается здесь: Sqlite load_extension не работает для Spatialite в Python и здесь: Используйте расширение Spacialite для SQLite в 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

Моим текущим решением было пересборка Python 2.7 и 3.4 с необходимыми настройками для пакета sqlite3. Это сработало, и я смог загрузить spatialite в качестве расширения и создать R*Tree.

Существует ли альтернативное более простое решение? Кто-нибудь нашел альтернативное решение, работая над setup.py из pyspatialite или pysqlite?


person gmas80    schedule 20.04.2015    source источник
comment
О проблеме сообщается здесь: github.com/ghaering/pysqlite/issues/72.   -  person gmas80    schedule 28.04.2015


Ответы (1)


Есть более простое решение, которое я только что получил. Я использую Windows 10 с Python 3.5, используя пакет sqlite3 по умолчанию и Spatialite 4.3.

Вот как я это сделал:

Давайте начнем с простой программы, которая загружает расширение spaceite (которое мы еще не установили):

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. Внизу есть ссылки на "двоичные файлы MS Windows". Я выбрал версию x86, текущую стабильную версию, и скачал файл с именем mod_spatialite-4.3.0a-win-x86.7z. Разархивируйте этот файл в тот же каталог, в котором находится ваш файл test.py, и теперь запуск программы не приведет к ошибкам (т. е. она работает!):

C:\> python test.py
C:\> 
person Emil Stenström    schedule 29.01.2017
comment
В предложенном вами решении могут быть проблемы, поскольку похоже, что загруженные вами двоичные файлы были собраны с помощью Visual Studio 2010. Это не официальный компилятор для Python 3.5+ (ни 2.7). - person gmas80; 30.01.2017
comment
Я сообщу, если столкнусь с какими-либо проблемами с этим методом. Пока мне удалось подключиться к пространственному, создать все таблицы метаданных и начать экспериментировать со столбцами POINT. Все без вопросов. - person Emil Stenström; 31.01.2017