python shelve bsddb устарела, как заставить полку использовать другую базу данных?

У меня есть приложение, разработанное на Python 2.7.2 для OS X. Я использую модульную полку и, кажется, по умолчанию использую bsddb на Mac. Программа не будет работать на компьютере с Windows 7 с ActiveState python 2.7, потому что модуль bsddb отсутствует и отсутствует в диспетчере пакетов ActiveState (pypm). В документации ActiveState указано, что она устарела в версии 2.6. Я предполагаю, что он пытается использовать bdddb, потому что питон OS X, создавший базу данных, по умолчанию использует bsddb. Когда я удаляю базу данных полки и запускаю ее в Windows, она успешно использует какую-то другую базовую базу данных. Питон Мака тоже доволен.

Поэтому я думаю, что я должен принудительно использовать бэкэнд, отличный от bdsdb, для полки. Как модуль gdbm. Но я не могу понять, как это сделать.


person Tim Richardson    schedule 23.09.2011    source источник


Ответы (2)


Вы можете установить тип создаваемой базы данных, установив 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
person unutbu    schedule 23.09.2011
comment
У меня проблема с Windows, с использованием ActiveState python и попыткой сделать исполняемый файл Windows с помощью py2exe. Исполняемый файл завершается со сбоем, так как при использовании shelve пытается загрузить bsddb. Когда я запускаю программу как python program.py, она работает. Значит у меня другая проблема. Использование вашего хака выше не имело значения. - person Tim Richardson; 23.09.2011
comment
Я удаляю базу данных полки, чтобы избежать каких-либо проблем. Я нашел публикацию 2004 года с настройкой, которая мне нужна для работы py2exe: мне нужно явно включить клон dbm. Поэтому я включаю dubmdbm через options={py2exe:{includes:[dumbdbm]}} в скрипт setup.py. - person Tim Richardson; 23.09.2011
comment
Ах я вижу. Я рад, что вы решили проблему. Возможно, добавьте ответ, и я удалю свой. - person unutbu; 23.09.2011
comment
На самом деле, вы ответили на вопрос, но, оказывается, я неправильно задал вопрос в конце. - person Tim Richardson; 24.09.2011

Кажется, я задал неправильный вопрос. При сборке исполняемого файла Windows py2exe не включал модули dbm (он не мог вывести эту зависимость), поэтому во время выполнения python в отчаянии пытался найти модуль bdbm.

этот сценарий setup.py включает модуль, который заставляет версию py2exe вести себя так, как если бы версия работала нормально. Он включает в себя модуль dbm-clone (я храню только десять простых словарей, поэтому базового модуля 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
)
person Tim Richardson    schedule 23.09.2011