2011-09-23 72 views
3

我有一款在OS X上的python 2.7.2開發的應用程序。 我使用模塊擱置,似乎默認爲Mac上的bsddb。 由於模塊bsddb不存在並且不在ActiveState的包管理器(pypm)中,因此該程序將無法在具有ActiveState python 2.7的Windows 7計算機上運行。 ActiveState的文檔在2.6版中已棄用。 我想它會嘗試bdddb,因爲創建數據庫的OS X python默認爲bsddb。 當我刪除擱置數據庫並在Windows上運行它時,它很高興地使用其他底層數據庫。 Mac的python也很開心。python擱置... bsddb不推薦...如何擱置使用另一個數據庫?

所以我認爲我應該強制使用非bdsdb後端擱置。像gdbm模塊一樣。 但我無法解決如何做到這一點。

回答

2

我似乎問錯了問題。當生成windows exe文件時,py2exe不包含dbm模塊(它無法推斷出這種依賴性),所以在運行時,python在絕望中試圖找到bdbm模塊。

此腳本setup.py包含一個模塊,它使得py2exe版本的行爲與正常運行的版本相似。它包括一個DBM克隆模塊(我只存儲十條簡單的字典所以基本dumbdbm模塊足夠

from distutils.core import setup 
import py2exe, sys, os 
from glob import glob 

sys.argv.append('py2exe') 
data_files = [("Microsoft.VC90.CRT", glob(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))] 
setup(
    data_files=data_files, 
    windows = ["cashflowSim.py"], 
    options={ 
     "py2exe":{"includes":["dumbdbm"]}}, 
     zipfile = None 
) 
3

在調用shelve.open之前,您可以設置通過設置anydbm._defaultmod創建的分貝類型。

這適用於Python 2.6(也許是2.7?),但由於anydbm._defaultmod是一個私有變量,請注意,這是一個黑客攻擊。

anydbm._defaultmod=__import__('gdbm') 

例如:

import anydbm 
import whichdb 
import contextlib 

anydbm._defaultmod=__import__('gdbm') 
filename='/tmp/shelf.dat' 
with contextlib.closing(shelve.open(filename)) as f: pass 
result=whichdb.whichdb(filename) 

print(result) 
# gdbm 
+0

我的問題是,在Windows下使用的ActiveState Python和嘗試使用,使一個Windows可執行良好py2exe。可執行文件失敗,因爲使用shelve試圖加載bsddb。當我運行該程序作爲python program.py它工作。所以我想我有另一個問題。使用上面的黑客沒有什麼區別。 –

+0

您是否正在閱讀現有文件,或創建一個新的? – unutbu

+0

我刪除擱置數據庫,以避免任何問題。我發現2004年發佈與調整我需要py2exe工作:我需要明確包括一個dbm克隆,所以我包括通過選項dubmdbm = {「py2exe」:{「includes」:[「dumbdbm」]}},i setup.py腳本。 –