python shelve ... bsddb已弃用 ... 如何让shelve使用其他数据库?
我有一个在 OS X 上用 Python 2.7.2 开发的应用程序。
我使用了一个叫做 shelve 的模块,它在 Mac 上默认使用 bsddb。
这个程序在 Windows 7 的机器上运行不了,因为 ActiveState 的 Python 2.7 没有 bsddb 模块,而且在 ActiveState 的包管理器(pypm)里也找不到。根据 ActiveState 的文档,bsddb 从 2.6 版本开始就被弃用了。
我猜是因为在 OS X 上创建数据库的 Python 默认使用了 bsddb,所以它尝试去用这个模块。
当我删除 shelve 数据库并在 Windows 上运行时,它就能顺利使用其他的数据库了。Mac 上的 Python 也没问题。
所以我在想,我应该强制 shelve 使用一个非 bsddb 的后端,比如 gdbm 模块。
但我不知道该怎么做。
2 个回答
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
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
)