2

我正在尝试冻结涉及使用搁置模块的应用程序。为了冻结它,我使用 GUI2EXE python 代码并利用 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)不能很好地与我程序的其他部分一起使用。另外,我真的很想使用 shelve——就像我说的,没有它,它可以编译并正常工作。

谢谢!

编辑

根据 Mike 的要求,我附上了安装脚本。是的,我尝试包含模块(未显示),但它不起作用。我什至在我的主脚本中包含了 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]
    )
4

2 回答 2

4

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)
于 2012-11-05T13:33:44.010 回答
0

您可以使用 pickle 而不是 shelve 来存储您的数据。或者您可以使用 ConfigObj 创建包含大部分信息的文本文件:http ://www.voidspace.org.uk/python/configobj.html

我想你甚至可以使用 SQLite 来存储你的大部分数据。如果您尝试保存 wxPython GUI 的状态,请参阅 PersistentManager:http: //xoomer.virgilio.it/infinity77/Phoenix/lib.agw.persist.persistencemanager.PersistenceManager.html

于 2012-11-02T13:29:33.560 回答