Ошибка 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 в одну папку
  • использовать полный путь к dlls
  • добавьте расположение dll в 'PATH' среды 'PATH'
  • добавьте расположение dll в атрибут sys.path как часть кода Python
  • скопируйте все DLL в папку c:\windows\system32 (в комплекте с перезапуском машины)
  • скопируйте все c:\windows\sysWoW64 папку 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)?

  • Быстрое сброс базы данных в память в файл
  • Ошибка декодирования Python ASCII и Unicode
  • Как заблокировать все соединение SQLite (заблокированное чтение + заблокированная запись)?
  • Сохранение и преобразование даты SQLite
  • Sqlite3 Обновление строки, определяемой переменной
  • Python: оптимизация кода с использованием SQLite3 + Mutagen
  • Нет модуля с именем _sqlite3
  • Почему SQLAlchemy вставляет sqlite в 25 раз медленнее, чем использование sqlite3 напрямую?
  • 4 Solutions collect form web for “Ошибка Sqlite load_extension для пространственных объектов в Python”

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

    Вот что вы можете попробовать (взято из этой записи в Google Groups ):

    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 из-за настроек пользовательских разрешений.

    Версия 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 будет использовать новый на вашем пути

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

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

    Во-первых, обратите внимание на обходное решение, которое может потребоваться для компиляции объединения пространственных объектов:

    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). Обратите внимание на следующие ссылки для обходных решений / исправлений …

    Билет № 574 OSGEO GEOS TRAC

    Билет «OSGEO GEOS TRAC» № 577

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

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

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

    На строке 45 добавьте «триангуляцию» (без кавычек) чуть ниже «упростить» и выше «использовать».

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

     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 в вашей папке build pyspatialite и добавить пути / bin, / lib и / include или 2.Directly отредактировать файл 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» все должно работать.

    Вы можете запустить все тесты в ./Python27/Lib/site-packages/pyspatialite/test – все они прошли для меня; однако лучше, более реалистичный тест может состоять в том, чтобы запустить пример кода из этой ссылки:

    SpatiaLite и Python

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

    Удачи!

    -RMWChaos

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

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

    Python - лучший язык программирования в мире.