Приложение Python и Freeze с shelve.py

Я пытаюсь заморозить приложение, в котором используется модуль полки. Чтобы заморозить его, я использую код Python GUI2EXE и использую часть cx_freeze (все отлично работает, если я удаляю часть полки).

Когда я запускаю свое скомпилированное приложение, оно жалуется на

File "anydbm.pyc", line 62, in ?
ImportError: no dbm clone found; tried ['dbhash', 'gdbm', 'dbm',
'dumbdbm']

Я искал ответы. Большинство из них сказали добавить это в сценарий:

for i in ['dbhash', 'gdbm', 'dbm', 'dumbdbm']:
    try: eval('import '+i)
    except: pass

Но мне это ничего не дало. Если я включу модуль dbhash, я получу ошибки, связанные с отсутствием модуля bsddb. Я не могу понять эту проблему. Я неправильно реализовал вышеизложенное? Я что-то упускаю?

PS, мне нужно использовать cx_freeze — другие (py2exe, pyinstaller) плохо работают с другими частями моей программы. Кроме того, я действительно хотел бы использовать полку — как я уже сказал, она прекрасно компилируется и работает без нее.

Спасибо!

ИЗМЕНИТЬ

По просьбе Майка я прикрепил сценарий установки. Да, я пытался включить модули (не показаны), но это не работает. Я даже включил anydbm и dbhash в свой основной скрипт. Это тоже не работает.

Кроме того, если вы знаете лучший способ хранения моих переменных/списков/диктов/и т. д., чем полка, я хотел бы знать. Я попробовал ZODB (тоже не очень хорошо). В настоящее время я нашел pdict (с PersistentDict), и это хорошо работает, когда я замораживаю приложение. Тем не менее, я считаю, что полка работает быстрее. Хотелось бы, чтобы полка работала, если это возможно...

Мой скрипт установки:

from cx_Freeze import setup, Executable

includes = []
excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
            'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
            'Tkconstants', 'Tkinter']
packages = []
path = []

for i in ['dbhash', 'gdbm', 'dbm', 'dumbdbm']:
    try: 
        eval('import '+i)
    except: 
        pass


GUI2Exe_Target_1 = Executable(
    # what to build
    script = "myscript.py",
    initScript = None,
    base = 'Win32GUI',
    targetDir = r"dist",
    targetName = "myscript.exe",
    compress = True,
    copyDependentFiles = False,
    appendScriptToExe = False,
    appendScriptToLibrary = False,
    icon = None
    )

setup(

    version = "0.1",
    description = "No Description",
    author = "No Author",
    name = "cx_Freeze Sample File",

    options = {"build_exe": {"includes": includes,
                             "excludes": excludes,
                             "packages": packages,
                             "path": path
                             }
               },

    executables = [GUI2Exe_Target_1]
    )

person mcfly    schedule 31.10.2012    source источник
comment
Как выглядит ваш установочный файл? GUI2Exe создаст его для вас. Я бы порекомендовал разместить его. Вы пытались добавить одну из этих библиотек в свой список включений?   -  person Mike Driscoll    schedule 01.11.2012
comment
Я отредактировал выше. Кроме того, Майк, ваш блог фантастический!   -  person mcfly    schedule 02.11.2012


Ответы (2)


eval('import foo') всегда будет терпеть неудачу: eval предназначен для выражений, а import — это инструкция. Вам следует избегать предложений except:, в которых не указан тип исключения — они скрывают настоящие ошибки в вашем коде.

Попробуйте что-то вроде этого:

for dbmodule in ['dbhash', 'gdbm', 'dbm', 'dumbdbm']:
    try:
        __import__(dbmodule)
    except ImportError:
        pass
    else:
        # If we found the module, ensure it's copied to the build directory.
        packages.append(dbmodule)
person Thomas K    schedule 05.11.2012

Вы можете использовать рассол вместо полки для хранения ваших данных. Или вы можете использовать ConfigObj для создания текстового файла с большей частью этой информации: http://www.voidspace.org.uk/python/configobj.html

Я полагаю, вы могли бы даже использовать SQLite для хранения большей части ваших данных. Если вы пытаетесь сохранить состояние своего графического интерфейса wxPython, см. PersistentManager: http://xoomer.virgilio.it/infinity77/Phoenix/lib.agw.persist.persistencemanager.PersistenceManager.html

person Mike Driscoll    schedule 02.11.2012