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)は私のプログラムの他の部分ではうまく機能しません。また、私は本当に棚を使いたいです-私が言ったように、それはコンパイルされ、それなしでうまく動作します。

ありがとう!

編集

マイクのリクエストに応じて、セットアップスクリプトを添付しました。はい、モジュール(図には示されていません)を含めようとしましたが、機能しません。メインスクリプトにanydbmとdbhashも含めました。これもうまくいかないようです。

また、棚よりも変数/リスト/辞書などを保存するためのより良い方法を知っているなら、私は知りたいです。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]
    )
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

データを保存するために、棚の代わりにピクルスを使用することができます。または、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 に答える