Ошибка Sqlite load_extension для пространственного объекта в Python

Я пытаюсь использовать бета-версию 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
  • скопировать все библиотеки в c:\windows\system32 папка (в комплекте с перезагрузкой машины)
  • скопировать все библиотеки в 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 и поместил все dll в папку System32. Итак, это говорит о том, что существует некоторая проблема с 64-битной настройкой. Может ли быть так, что мне нужна другая версия MSVC (я не думаю, что веб-сайт Spatialite говорит, что это необходимо, поэтому я могу только догадываться - у меня установлен MSVC2010)?

4 ответа

Версия 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 то есть в вашем каталоге Python DLLs, что-то вроде sqlite3_old.dll, так что Python будет использовать новый на вашем пути

Смотрите этот блог для получения дополнительной информации.

У меня была та же самая проблема, и это смущало меня в течение многих дней. Я использую 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. Добавьте эту папку в ваш путь.

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

Я только недавно прошел через кошмарную сборку 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 Билет № 574

OSGEO GEOS TRAC Билет № 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. напрямую отредактируйте файл 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 и Python

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

Удачи!

-RMWChaos

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

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

Другие вопросы по тегам