首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用shelve.py实现Python与冻结应用程序

用shelve.py实现Python与冻结应用程序
EN

Stack Overflow用户
提问于 2012-10-31 18:17:50
回答 2查看 881关注 0票数 2

我试图冻结一个涉及搁置模块使用的应用程序。为了冻结它,我使用了GUI2EXE python代码并使用了cx_freeze部分(如果删除搁置部分,一切都很好)。

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

代码语言:javascript
复制
File "anydbm.pyc", line 62, in ?
ImportError: no dbm clone found; tried ['dbhash', 'gdbm', 'dbm',
'dumbdbm']

我四处寻找答案。他们中的大多数人说要在脚本中添加以下内容:

代码语言:javascript
复制
for i in ['dbhash', 'gdbm', 'dbm', 'dumbdbm']:
    try: eval('import '+i)
    except: pass

但是,这对我没什么好处。如果我包含dbhash模块,那么就会得到与bsddb模块不存在相关的错误。我似乎找不出这个问题。我是否不正确地执行上述规定?我是不是遗漏了什么?

PS,我需要使用cx_freeze --其他的(py2exe,pyinstaller)不能很好地处理我的程序的其他部分。而且,我真的很想使用搁置--就像我说的,没有它它就能编译和工作。

谢谢!

编辑

根据迈克的要求,我附上了安装脚本。是的,我尝试包括模块(未显示),但它不工作。我甚至在我的主脚本中包含了anydbm和db散列。这看起来也不管用。

此外,如果您知道比搁置更好地存储我的变量/列表/dicts/等等,我很想知道。我尝试了ZODB (也没有很好地构建)。目前,我确实找到了pdict (使用PersistentDict),当我冻结应用程序时,它工作得很好。然而,我发现搁置更快。如果可能的话想让架子工作..。

我的安装脚本:

代码语言:javascript
复制
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]
    )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-05 13:33:44

eval('import foo')总是失败的: eval是用于表达式的,而导入是一条语句。您应该避免不指定异常类型的except:子句--它们会在代码中隐藏真正的bug。

试着做这样的事情:

代码语言:javascript
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2012-11-02 13:29:33

您可以使用泡菜而不是搁置来存储数据。或者您可以使用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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13164245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档