2011-12-21 55 views
8

我想使用Spatialite beta 3.0版本,因爲我在64位機器上使用了 Windows 7。Sqlite load_extension在Python中的空間失敗

當我嘗試加載 libspatialite-4.dll時,我始終得到可怕的sqlite3.OperationalError: The specified module could not be found.錯誤。

我曾嘗試以下:

  • libspatialite-4.dll並在同一文件夾中的所有其他DLL
  • 使用完整路徑的dll
  • 添加DLL位置到'PATH'環境變量
  • 作爲Python代碼的一部分,將dll位置附加到sys.path屬性
  • 複製c:\windows\system32文件夾中的所有dll(com隨着機器的啓動)
  • 複製在c:\windows\sysWoW64文件夾中所有的DLL(完整的,這是應該是32倍的DLL機器的重新啓動,但我想也無妨)

我的代碼是plete如下:

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

注 - 我已經嘗試完整的路徑也沒有運氣。我記得 與Windows XP 32位相同的問題。我得到它的工作,但不能 記得我做過什麼:(

UPDATE

我已經測試了32位的安裝的Windows 7,並把所有的DLL中的System32文件夾中的作品。所以,這表明64位設置存在一些問題,難道是我需要MSVC的另一個版本(我不認爲Spatialite網站說明哪些是必要的,所以我可能只需猜測 - 我已經安裝了MSVC2010) ?

+0

可能重複的[SQLite + SpatiaLite問題](http://stackoverflow.com/questions/1556436/sqlite-spatialite-problems) – 2011-12-21 13:36:30

+0

剛剛檢查線程,塞德里克 - 我錯過了我的搜索。這個問題是類似的,雖然我使用的是Python而不是C#,而且我也使用了自此之後新的64位測試版本。我絕對擁有該線程中列出的所有DLL,因此解決方案並不能解決我的問題。 – MappaGnosis 2011-12-21 14:27:37

回答

2

我遇到了同樣的問題,它讓我困惑了好幾天。我在Windows 7(x64)上運行Python 2.6(32位),所以它可能與您的設置不同五個。

這裏是你可以嘗試什麼(從這個Google Groups post拍攝):

  1. 把spatialite的DLL(libgeos_c-1.DLL,libgeos-3-0-0.dll,libproj-0.dll,以及libspatialite-2.dll)複製到C:/驅動器上的文件夾中。
  2. 將此文件夾添加到您的PATH。

問題似乎是由於用戶權限設置,Windows可能無法從C:\ Windows \ system32加載dll。

0

我剛剛經歷了x64 build pyspatialite 3.0.1及其所有依賴庫的噩夢。它可以完成,但需要一些「調整」才能做到。

首先,請注意可能需要編譯空間位置的解決方法。Ç合併在這裏:

Pyspatialite 3.0.1 Issue #7 Comment #3

其次,我建議你用2008 MSVC/SDK 7.0 x64的,這是Python 2.7版的x64與編譯編譯。當我使用mingw-w64編譯依賴庫時,我遇到了很多麻煩,試圖讓事情編譯正確。 (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

如果從577下載這兩個makefile文件,它們包括在574

的修復也將要下載其中一個夜間快照,並在編譯之前將geos/src/triangulate目錄複製到build文件夾中,因爲它在svn_trunk中缺失。

最後,你要稍作修改GEOS/src目錄/ dirlist.mk:

在第45行,添加「三角\」(不含引號)略低於「簡化\」以上' UTIL」。

現在,當您編譯,你可能會看到一些警告,但構建不應該完全失敗......

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

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

這需要你的庫依賴護理。現在,你需要做兩件事情之一: 1.Either在pyspatialite build文件夾中創建一個setup.cfg文件,並添加/箱,/ 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 and Python

筆者進入不包括細節得到的依賴庫在64位的工作步驟環境,但是,我沒有發現他們特別有用,因爲pyspatialite 3.0.1現在自動檢測spatialite合併下載相應版本。網站上的示例代碼創建了一個空間數據庫文件並使用數千個條目填充它。一切順利爲我運行;所以我相信上面概述的方法來獲得pyspatialite x64構建工作。

祝你好運!

-RMWChaos

0

我在過去後here以下說明解決了這個。我的系統是,根據上面的一些 - Win7的64位與32位的Spatialite庫和python的pysqlite庫。我鏈接到我的DLL目錄中的sqlite3.dll(這是ArcGIS安裝的Python,與其他安裝略有不同)。

這解決了與通過pysqlite加載Spatialite 4 DLL的問題。

1

Python中包含的sqlite3.dll版本似乎不想用於Spatialite。我能得到工作的唯一的事(短編譯一切從來源)是:

  1. 下載SQLite(或cyqlite - 的SQLite for Windows的重新編譯了一些方便的功能啓用,如R-樹這樣你就可以做spaital指標),即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的DLL目錄,喜歡的東西sqlite3_old.dll,這樣Python將使用您的路徑上的新的

有關更多信息,請參見this blog post