Sqlite load_extension falla para spatialite en Python

Estoy tratando de usar la versión beta de Spatialite 3.0 porque estoy usando Windows 7 en una máquina de 64 bits.

Consecuentemente recibo el temido sqlite3.OperationalError: The specified module could not be found. error cuando bash cargar libspatialite-4.dll .

He probado lo siguiente:

  • ponga libspatialite-4.dll y todas las demás dlls en la misma carpeta
  • Usa el camino completo a las DLLs.
  • agrega la ubicación dll a la 'PATH' entorno 'PATH'
  • agregue la ubicación de dll al atributo sys.path como parte del código de Python
  • copie todos los archivos DLL en la carpeta c:\windows\system32 (complete con el reinicio de la máquina)
  • copie todos los archivos c:\windows\sysWoW64 carpeta c:\windows\sysWoW64 (con el reinicio de la máquina, se supone que debe ser para archivos c:\windows\sysWoW64 de 32 bits, pero lo intenté de todos modos)

Mi código es el siguiente:

 import sqlite3 conn = sqlite3.connect(":memory:") conn.enable_load_extension(True) conn.execute('SELECT load_extension("libspatialite-4.dll")') 

NOTA – He intentado el camino completo también sin suerte. Recuerdo que tuve el mismo problema con Windows XP de 32 bits. Lo tengo funcionando pero no puedo recordar lo que hice 🙁

ACTUALIZAR

He probado la configuración en Windows 7 de 32 bits y he puesto todos los archivos DLL en la carpeta System32. Por lo tanto, esto sugiere que hay algún problema con la configuración de 64 bits. ¿Podría ser que necesito otra versión de MSVC (no creo que el sitio web de Spatialite diga cuál es la necesaria, así que podría tener que adivinar, tengo instalado MSVC2010)?

Estaba teniendo el mismo problema y me confundió durante días. Estoy ejecutando Python 2.6 (32 bits) en Windows 7 (x64), por lo que puede que no sea la misma configuración que tiene.

Esto es lo que puedes probar (tomado de esta publicación de Grupos de Google ):

  1. Coloque las dlls spatialite (libgeos_c-1.dll, libgeos-3-0-0.dll, libproj-0.dll y libspatialite-2.dll) en una carpeta en la unidad C: /.
  2. Agregue esta carpeta a su RUTA.

El problema parece ser que Windows no puede cargar los archivos DLL desde C: \ Windows \ system32 debido a la configuración de permisos de usuario.

Hace poco pasé por una pesadilla de una comstackción x64 de pyspatialite 3.0.1 y todas sus bibliotecas dependientes. Se puede hacer, pero toma algunos “ajustes” para hacerlo bien.

Primero, note la solución que puede ser necesaria para comstackr la amalgama de spatialite.c aquí:

Pyspatialite 3.0.1 Issue # 7 Comment # 3

En segundo lugar, le sugiero que compile con MSVC 2008 / SDK 7.0 x64, que es con lo que se comstack Python 2.7 x64. Me encontré con una gran cantidad de problemas al intentar comstackr las cosas correctamente cuando compilé las librerías de dependencia con mingw-w64.

Iconv (v. 1.9.2) y proj4 (v. 4.8.0) parecen comstackr e instalarse muy bien; sin embargo, es posible que tenga algunos problemas al usar el último servicio de administración de fondos (gos) svn_trunk (v. 3.3.5) Tenga en cuenta los siguientes enlaces para soluciones / arreglos …

Boleto OSGEO GEOS TRAC # 574

Boleto OSGEO GEOS TRAC # 577

Si descarga los dos makefiles de 577, incluyen la corrección en 574.

También querrá descargar una de las instantáneas nocturnas y copiar el directorio geos / src / triangulate sobre su carpeta de comstackción antes de comstackr, ya que falta en svn_trunk.

Finalmente, querrás hacer una modificación menor a geos / src / dirlist.mk:

En la línea 45, agregue ‘triangulate \’ (sin comillas) justo debajo de ‘simplify \’ y arriba de ‘util’.

Ahora, cuando compiles, puedes ver algunas advertencias, pero la comstackción no debería fallar completamente …

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

Eso se encarga de tus dependencias lib. Ahora necesita hacer una de estas dos cosas: 1. Cree un archivo setup.cfg en su carpeta de comstackción pyspatialite y agregue las rutas / bin, / lib y / include, o 2. Edite directamente el archivo setup.py de pyspatialite y hacer lo mismo.

Me resultó más fácil editar el archivo setup.py directamente, y agregar las rutas a las bibliotecas de dependencia para que se vean similares a:

 (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'] 

Si después de realizar estos cambios, pyspatialite aún no puede comstackrse, realice un conjunto más de modificaciones a setup.py: alrededor de la línea 121, agregue las siguientes líneas …

 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') 

Recuerde reemplazar las rutas para que coincida con su configuración particular. Deberias hacer eso. Después de ejecutar ‘python setup.py install’, todo debería funcionar.

Puedes ejecutar todas las pruebas en ../Python27/Lib/site-packages/pyspatialite/test – todas pasaron por mí; sin embargo, una prueba mejor y más realista podría ser ejecutar el código de ejemplo desde este enlace:

SpatiaLite y Python

Sin embargo, los pasos que sigue el autor no cubren los detalles para que las bibliotecas de dependencias funcionen en un entorno de 64 bits, y no las encontré particularmente útiles, ya que pyspatialite 3.0.1 ahora detecta automáticamente la versión adecuada de la amalgamación espacial. descargar. El código de muestra en el sitio crea un archivo de base de datos espacial y lo llena con miles de entradas. Todo funcionó con éxito para mí; por lo que creo que el método descrito anteriormente para obtener una construcción pyspatialite x64 funciona.

¡Buena suerte!

-RMWChaos

La versión de sqlite3.dll incluida con Python no parece querer jugar bien con Spatialite. Lo único que pude ponerme a trabajar (a falta de comstackr todo de la fuente) fue:

  1. Descargue SQLite (o cyqlite , una comstackción de SQLite para Windows con algunas funciones útiles habilitadas, como R-Tree para que pueda hacer índices de spa), es decir, sqlite-dll-win32-x86-[version].zip
  2. Descargar mod_spatialite (los archivos binarios de Windows están en el cuadro rosado en la parte inferior de la página), es decir, mod_spatialite-[version]-win-x86.7z
  3. Descomprima primero SQLite / cyqlite luego mod_spatialite en la misma carpeta (sobrescriba si hay algún conflicto)
  4. Agregue esta carpeta a su ruta del sistema
  5. Cambie el nombre del sqlite3.dll que está en su directorio de Python DLLs, a algo como sqlite3_old.dll , para que Python use el nuevo en su ruta

Ver esta publicación del blog para más información.

Resolví esto siguiendo las instrucciones en el último post aquí . Mi sistema era, según algunos de los anteriores: Win7 de 64 bits con bibliotecas de espacialidad de 32 bits y la biblioteca pysqlite para python. Me vinculé a sqlite3.dll en mi directorio DLL (este es el Python que instala ArcGIS, por lo que es ligeramente diferente a otras instalaciones).

Esto solucionó el problema con la carga de Spatialite 4 dll a través de pysqlite.