我正在尝试冻结涉及使用搁置模块的应用程序。要冻结它,我使用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模块i,则会收到与没有bsddb模块相关的错误。我似乎无法解决这个问题。我错误地执行了上述操作吗?我错过了什么吗?
PS,我需要使用cx_freeze - 其他(py2exe,pyinstaller)与我的程序的其他部分不兼容。此外,我真的想使用搁置 - 就像我说的,它编译并在没有它的情况下正常工作。
谢谢!
修改
根据迈克的要求,我附上了设置脚本。是的,我试图包含模块(未显示),但它不起作用。我甚至在主脚本中包含了anydbm和dbhash。这似乎也不起作用。
另外,如果你知道一个更好的方法来存储我的变量/列表/ dicts /等而不是搁置,我很想知道。我尝试过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]
)
答案 0 :(得分: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)
答案 1 :(得分:0)
您可以使用pickle而不是搁置来存储您的数据。或者您可以使用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