【问题标题】:python shelve ... bsddb deprecated ... how to get shelve to use another database?python shelve ... bsddb deprecated ... 如何让 shelve 使用另一个数据库?
【发布时间】:2011-09-23 01:05:39
【问题描述】:

我有一个在 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 模块一样。 但我不知道该怎么做。

【问题讨论】:

    标签: python shelve


    【解决方案1】:

    您可以在调用shelve.open之前通过设置anydbm._defaultmod来设置创建的db类型。

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

    【讨论】:

    • 我遇到的问题是在 windows 上,使用 ActiveState python,并尝试使用 py2exe 使 windows 可执行。可执行文件失败,因为使用搁置尝试加载 bsddb。当我将程序作为 python program.py 运行时,它可以工作。所以我想我还有另一个问题。使用上面的 hack 没有任何区别。
    • 我删除了搁置数据库以避免任何问题。我发现了一个 2004 年发布的帖子,其中包含使 py2exe 正常工作所需的调整:我需要明确包含一个 dbm 克隆。所以我在 setup.py 脚本中通过 options={ "py2exe":{"includes":["dumbdbm"]}} 包含 dubmdbm。
    • 啊,我明白了。我很高兴你解决了这个问题。也许添加一个答案,我会删除我的。
    • 其实你回答了这个问题,但结果我问错了。
    【解决方案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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2023-01-20
      • 2018-11-13
      相关资源
      最近更新 更多