Python和Freeze应用程序与shelve.py

Python和Freeze应用程序与shelve.py,python,wxpython,cx-freeze,shelve,Python,Wxpython,Cx Freeze,Shelve,我正在尝试冻结一个涉及搁置模块使用的应用程序。为了冻结它,我使用了gui2exepython代码和cx\u冻结部分,如果我删除搁置部分,一切都会很好 当我运行编译后的应用程序时,它会抱怨 File "anydbm.pyc", line 62, in ? ImportError: no dbm clone found; tried ['dbhash', 'gdbm', 'dbm', 'dumbdbm'] 我到处寻找答案。他们中的大多数人说要在脚本中添加以下内容: for i in ['dbhas

我正在尝试冻结一个涉及搁置模块使用的应用程序。为了冻结它,我使用了gui2exepython代码和cx\u冻结部分,如果我删除搁置部分,一切都会很好

当我运行编译后的应用程序时,它会抱怨

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模块相关的错误。我似乎无法解决这个问题。我是否错误地执行了上述操作?我错过什么了吗

另外,我需要使用cx_freeze-其他py2exe、pyinstaller不能很好地与我的程序的其他部分配合使用。另外,我真的很想使用shelve——就像我说的,没有它,它编译和工作都很好

谢谢

编辑

根据Mike的要求,我已经附上了安装脚本。是的,我尝试过包含未显示的模块,但不起作用。我甚至在我的主脚本中包含了anydbm和dbhash。这似乎也不起作用

另外,如果您知道比shelve更好的存储变量/列表/dicts/等的方法,我很想知道。我试过ZODB也没有很好的构建。目前,我确实发现了PersistentDict的pdict,当我冻结应用程序时,它工作得很好。然而,我发现搁置更快。如果可能的话,想让搁置工作

我的安装脚本:

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]
    )

您可以使用pickle而不是shelve来存储数据。或者,您可以使用ConfigObj创建包含大部分信息的文本文件:


我想您甚至可以使用SQLite来存储大部分数据。如果您试图保存wxPython GUI的状态,请参阅PersistentManager:

您可以使用pickle而不是shelve来存储数据。或者,您可以使用ConfigObj创建包含大部分信息的文本文件:

我想您甚至可以使用SQLite来存储大部分数据。如果您试图保存wxPython GUI的状态,请参阅PersistentManager:

eval'import foo'将始终失败:eval用于表达式,而import是语句。您应该避免使用不指定异常类型的exception:子句—它们会在代码中隐藏真正的错误

试着这样做:

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)
eval'import foo'将始终失败:eval用于表达式,而import是语句。您应该避免使用不指定异常类型的exception:子句—它们会在代码中隐藏真正的错误

试着这样做:

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)

您的安装文件是什么样子的?GUI2Exe为您创建一个。我建议把它寄出去。您是否尝试将其中一个LIB添加到您的包含列表中?我在上面进行了编辑。还有,迈克,你的博客太棒了!您的安装文件是什么样子的?GUI2Exe为您创建一个。我建议把它寄出去。您是否尝试将其中一个LIB添加到您的包含列表中?我在上面进行了编辑。还有,迈克,你的博客太棒了!