2012-10-31 98 views
2

我想冻结涉及使用搁置模块的应用程序。为了冻结它,我使用了GUI2EXE python代码并利用了cx_freeze部分(如果我删除搁架部分,一切都很好)。Python和冻结应用程序与shelve.py

当我去跑我的编译的应用程序,它抱怨的

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

什么是您的安装文件是什么样子? GUI2Exe为您创建一个。我会推荐发布它。你有没有尝试将这些库中的一个添加到你的包含列表中? –

+0

我上面编辑过。另外,Mike,你的博客太棒了! – mcfly

回答

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)