2011-12-21 7 views
8

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

Obtengo el error sqlite3.OperationalError: The specified module could not be found. cuando intento cargar .

he intentado lo siguiente:

  • poner libspatialite-4.dll y todos los demás archivos DLL en la misma carpeta
  • utilizar la ruta completa de los archivos DLL
  • añadir la ubicación del DLL a la 'PATH' variable de entorno
  • anexe la ubicación dll al atributo sys.path como parte del código Python
  • copie todos los dlls en la carpeta c:\windows\system32 (com plete con el reinicio de la máquina)
  • copiar todos los archivos DLL en la carpeta c:\windows\sysWoW64 (con reinicio de la máquina de esto se supone que es para 32 dlls bits, pero lo intenté de todas formas)

mi código es tan sigue:

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

NOTA - He probado la ruta completa sin suerte. Recuerdo tener el mismo problema con Windows XP de 32 bits. Lo tengo trabajo pero no puede recordar lo que hice :(

ACTUALIZACIÓN

He probado la configuración en Windows de 32 bits 7 y poner todos los archivos DLL en la carpeta System32 funciona. Así, esto sugiere que hay algún problema con la configuración de 64 bits. ¿Podría ser que necesite otra versión de MSVC? (No creo que el sitio web de Spatialite diga que es necesario, así que podría tener que adivinar, tengo instalado MSVC2010) ?

+0

posible duplicado de [SQLite + SpatiaLite problems] (http://stackoverflow.com/questions/1556436/sqlite-spatialite-problems) –

+0

Acabo de verificar ese hilo, Cedric - Lo perdí en mi búsqueda. El problema es similar, aunque estoy usando Python no C# y también estoy usando la versión beta de 64 bits, que es nueva desde entonces. Definitivamente tengo todos los dlls listados en ese hilo para que la solución no resuelva mi problema. – MappaGnosis

Respuesta

2

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

Esto es lo que se puede tratar (tomado de esta Google Groups post):

  1. Ponga los archivos DLL 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 puede no cargar los dlls de C: \ Windows \ system32 debido a la configuración de los permisos de usuario.

0

Acabo de pasar por una pesadilla de una versión x64 de pyspatialite 3.0.1 y todas sus bibliotecas dependientes. Se puede hacer, pero requiere algunos "ajustes" para hacerlo bien.

En primer lugar, tenga en cuenta la solución que puede ser necesaria para compilar spatialite.c amalgama aquí:

Pyspatialite 3.0.1 Issue #7 Comment #3

En segundo lugar, le sugiero que compila con MSVC 2008/SDK 7.0 x64, que es lo que Python 2.7 x64 está compilado con. Me encontré con un gran problema tratando de compilar las cosas justo cuando compilé las bibliotecas de dependencia con mingw-w64.

iconv (v 1.9.2) y proj4 (v. 4.8.0) ambos parecen compilarse e instalarse perfectamente; sin embargo, puede tener algunos problemas con el último svn_trunk de GEOS (v. 3.3.5). Tenga en cuenta los siguientes enlaces para soluciones provisionales/correcciones ...

OSGEO GEOS TRAC Ticket #574

OSGEO GEOS TRAC Ticket #577

Si descarga los dos archivos make de 577, que incluyen el arreglo de 574.

Usted también querrá descargue una de las instantáneas nocturnas y copie el directorio geos/src/triangulate en su carpeta de compilación antes de compilar, ya que falta en svn_trunk.

Por último, tendrá que hacer una modificación menor a GEOS/src/dirlist.mk:

En la línea 45, agregue 'triangular \' (sin comillas) justo debajo de 'simplificar \' y más » util '.

Ahora cuando se compila, se pueden ver algunas advertencias, pero la construcción no debe fallar pura y simple ...

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

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

que se encarga de sus dependencias de bibliotecas. Ahora debe hacer una de estas dos cosas: 1. Cree un archivo setup.cfg en su carpeta de construcción pyspatialite y agregue las rutas/bin,/lib, y/include, o 2. Edite de forma directa la configuración de pyspatialite.py archivo y haz lo mismo.

me pareció más fácil de editar el archivo setup.py directamente, y agregue las rutas de acceso a las librerias dependientes a ser similar 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 sigue sin construir para usted, a continuación, hacer un conjunto más de las modificaciones a setup.py: alrededor de la línea 121, añadir 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 los caminos para que coincida con su configuración particular. Deberias hacer eso. Después de ejecutar 'python setup.py install' todo debería funcionar.

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

SpatiaLite and Python

Los pasos el autor entra en no cubra el detalle para conseguir las librerias dependientes que trabajan en un bit x64 Sin embargo, no me pareció particularmente útil ya que pyspatialite 3.0.1 ahora detecta automáticamente la versión apropiada de la fusión de spatialite para descargar. El código de muestra en el sitio crea un archivo de base de datos spatialite y lo rellena con miles de entradas. Todo funcionó con éxito para mí; así que creo que el método descrito anteriormente para obtener una construcción pyspatialite x64 funciona.

¡Buena suerte!

-RMWChaos

0

Solucioné, siguiendo las instrucciones en el último mensaje here. Mi sistema era, como he mencionado anteriormente, Win7 de 64 bits con bibliotecas spatialite de 32 bits y la biblioteca pysqlite para Python. Me vinculé a sqlite3.dll en mi directorio DLL (este es el Python que ArcGIS instala, tan ligeramente diferente a otras instalaciones).

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

1

La versión de sqlite3.dll incluida con Python no parece querer jugar bien con Spatialite. La única cosa que podría llegar al trabajo (por debajo de la compilación de todo, desde la fuente) fue:

  1. Descargar SQLite (o cyqlite - una recompilación de SQLite para Windows con algunas características útiles habilitados, tales como R-árbol para que pueda hacer índices spaital), es decir, sqlite-dll-win32-x86-[version].zip
  2. Descargar mod_spatialite (binarios de Windows están en el cuadro de color rosa en la parte inferior de la página), es decir mod_spatialite-[version]-win-x86.7z
  3. Descomprimir primeraSQLite/cyqlitecontinuaciónmod_spatialite en el misma carpeta (sobrescribir si hay algún conflicto)
  4. Añadir esta carpeta a la ruta del sistema
  5. Cambie el nombre del sqlite3.dll que está en el directorio de Python DLL, a algo así como sqlite3_old.dll, por lo que Python utilizará el nuevo en su ruta

Consulte this blog post para obtener más información.