python搁置... bsddb弃用...如何搁置使用另一个数据库?

时间:2011-09-23 01:05:40

标签: python shelve

我在OS X上有一个在python 2.7.2中开发的应用程序。 我使用模块搁置,似乎默认为mac上的bsddb。 该程序不能在具有ActiveState python 2.7的Windows 7计算机上运行,​​因为模块bsddb不存在且不在ActiveState的包管理器(pypm)中。 ActiveState的文档说在2.6版已弃用。 我想它尝试bdddb,因为创建数据库的OS X python默认为bsddb。 当我删除shelve数据库并在Windows上运行它时,它很乐意使用其他一些底层数据库。 Mac的蟒蛇也很高兴。

所以我认为我应该强制使用非bdsdb后端进行搁置。像gdbm模块一样。 但我无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:3)

您可以在调用anydbm._defaultmod之前设置shelve.open创建的数据库类型。

这适用于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

答案 1 :(得分:2)

我似乎问错了问题。在构建windows exe时,py2exe不包含dbm模块(它无法推断出这种依赖关系),所以在运行时python绝望中试图找到bdbm模块。

此脚本setup.py包含一个模块,使py2exe版本的行为与正常运行的版本相同。它包括一个dbm-clone模块(我只存储十个简单的字典,所以基本的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
)