3

OS Xでpython 2.7.2で開発されたアプリがあります。モジュールshelveを使用しており、Macではデフォルトでbsddbになっているようです。モジュール bsddb が存在せず、ActiveState のパッケージ マネージャー (pypm) に含まれていないため、プログラムは ActiveState python 2.7 を搭載した Windows 7 マシンでは実行されません。ActiveState のドキュメントには、v 2.6 で非推奨と記載されています。DBを作成したOS X pythonのデフォルトがbsddbであるため、bdddbを試していると思います。shelve データベースを削除して Windows で実行すると、基盤となる他のデータベースが問題なく使用されます。Macのパイソンも大喜び。

したがって、シェルブには bdsdb 以外のバックエンドの使用を強制する必要があると思います。gdbm モジュールと同様です。しかし、私はそれを行う方法を理解できません。

4

2 に答える 2

3

anydbm._defaultmodを呼び出す前に設定することで、作成される db のタイプを設定できます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
于 2011-09-23T01:29:49.293 に答える
2

間違った質問をしたようです。Windows exeをビルドするとき、py2exeにはdbmモジュールが含まれていなかったため(この依存関係を推測できませんでした)、実行時にPythonが必死になってbdbmモジュールを見つけようとしました。

このスクリプト setup.py には、py2exe バージョンを通常の実行バージョンのように動作させるモジュールが含まれています。dbm-clone モジュールが含まれています (単純な辞書を 10 個しか格納していないので、基本的な dumpdbm モジュールで十分です)

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 に答える