3

我有一个在 OS X 上用 python 2.7.2 开发的应用程序。我使用模块搁置,似乎在 mac 上默认为 bsddb。该程序不会在装有 ActiveState python 2.7 的 Windows 7 机器上运行,因为模块 bsddb 不存在并且不在 ActiveState 的包管理器 (pypm) 中。ActiveState 的文档说在 v 2.6 中已弃用。我猜它会尝试 bdddb,因为创建 DB 的 OS X python 默认为 bsddb。当我删除搁置数据库并在 Windows 上运行它时,它愉快地使用了其他一些底层数据库。Mac的python也很开心。

所以我认为我应该强制使用非 bdsdb 后端进行搁置。就像 gdbm 模块一样。但我不知道该怎么做。

4

2 回答 2

3

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

这适用于 Python 2.6(也许适用于 2.7?),但由于anydbm._defaultmod是私有变量,请注意这是一个 hack。

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
于 2011-09-23T01:29:49.293 回答
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
)
于 2011-09-23T21:30:47.277 回答