Ошибка Sqlite load_extension для пространственного объекта в Python - PullRequest
9 голосов
/ 21 декабря 2011

Я пытаюсь использовать бета-версию Spatialite 3.0, потому что я использую Windows 7 на 64-разрядной машине.

Я постоянно получаю страшную ошибку sqlite3.OperationalError: The specified module could not be found. при попытке загрузить libspatialite-4.dll.

Я пробовал следующее:

  • положить libspatialite-4.dll и все остальные библиотеки в той же папке
  • использовать полный путь к DLL
  • добавить местоположение dll в переменную окружения 'PATH'
  • добавить местоположение dll к атрибуту sys.path как часть кода Python
  • скопировать все 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")')

ПРИМЕЧАНИЕ. - Я тоже перепробовал полный путь, но безуспешно.Я помню ту же проблему с 32-битной Windows XP.Я получил это работает, но не могу вспомнить, что я сделал: (

ОБНОВЛЕНИЕ

Я протестировал установку на 32-битной Windows 7 и поместил все библиотеки впапка System32 работает. Итак, это говорит о том, что есть проблема с 64-битной установкой. Может быть, мне нужна другая версия MSVC (я не думаю, что веб-сайт Spatialite говорит, что это необходимо, поэтому мне, возможно, придется простоугадайте - у меня установлен MSVC2010)?

Ответы [ 4 ]

2 голосов
/ 09 июня 2012

У меня была такая же проблема, и это смущало меня в течение нескольких дней.Я использую Python 2.6 (32-разрядная версия) в Windows 7 (x64), поэтому он может отличаться от того, который вы установили.

Вот что вы можете попробовать (взято из этого сообщения групп Google ):

  1. Поместите пространственные dll (libgeos_c-1.dll, libgeos-3-0-0.dll, libproj-0.dll и libspatialite-2.dll) в папку на диске C: /.
  2. Добавьте эту папку в вашу PATH.

Проблемы заключаются в том, что Windows может не загружать библиотеки DLL из C: \ Windows \ system32 из-за настроек пользовательских разрешений.

1 голос
/ 12 ноября 2015

Версия sqlite3.dll, включенная в Python, похоже, не хочет хорошо играть со Spatialite. Единственное, что я мог заставить работать (кроме компиляции всего из исходного кода), было:

  1. Загрузка SQLite (или cyqlite - перекомпиляция SQLite для 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, который находится в вашем каталоге DLL-файлов Python, на что-то вроде sqlite3_old.dll, чтобы Python использовал новый на вашем пути

Подробнее см. в этом блоге .

1 голос
/ 31 июля 2012

Я только недавно прошел через кошмарную сборку x64 pyspatialite 3.0.1 и всех его зависимых библиотек. Это может быть сделано, но требуется некоторая «подстройка», чтобы сделать это правильно.

Во-первых, обратите внимание на обходной путь, который может понадобиться для компиляции слияния spaceite.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 Ticket # 574

OSGEO GEOS TRAC Ticket # 577

Если вы загрузите два make-файла из 577, они будут содержать исправление в 574.

Вы также захотите загрузить один из ночных снимков и скопировать каталог geos / src / triangulate в папку сборки перед компиляцией, так как он отсутствует в svn_trunk.

Наконец, вы захотите внести небольшие изменения в geos / src / dirlist.mk:

В строке 45 добавьте 'triangulate \' (без кавычек) чуть ниже 'упрощение \' и над 'util'.

Теперь, когда вы компилируете, вы можете увидеть некоторые предупреждения, но сборка не должна провалиться сразу ...

nmake /f makefile.vc PREFIX=../Path/To/Geos/Install/Here

nmake install /f makefile.vc PREFIX=../Path/To/Geos/Install/Here

Это заботится о ваших зависимостях lib. Теперь вам нужно сделать одну из двух вещей: 1. Либо создайте файл setup.cfg в папке сборки pyspatialite и добавьте пути / bin, / lib и / include, либо 2. Отредактируйте файл setup.py pyspatialite и сделайте то же самое.

Мне было проще всего напрямую отредактировать файл 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

Однако шаги, которые делает автор, не охватывают детали, позволяющие библиотекам зависимостей работать в 64-битной среде, и я не нашел их особенно полезными, поскольку pyspatialite 3.0.1 теперь автоматически определяет соответствующую версию Пространственное объединение для загрузки. Пример кода на сайте создает файл базы данных пространственных данных и заполняет его тысячами записей. Все прошло успешно для меня; поэтому я полагаю, что описанный выше способ получения сборки x64 для pyspatialite работает.

Удачи!

-RMWChaos

0 голосов
/ 26 апреля 2013

Я решил это, следуя инструкциям в последнем посте здесь .Моя система, как указано выше, была 64-битной Win7 с 32-битными библиотеками пространственных данных и библиотекой pysqlite для python.Я связался с sqlite3.dll в моем каталоге DLL (это Python, который устанавливает ArcGIS, поэтому он немного отличается от других установок).

Это решило проблему с загрузкой Splliteite 4 dll через pysqlite.

...