1

ワイヤレスハンドヘルドコンピューターのサーバーとして動作しているPythonモジュールがあります。ハンドヘルドがサーバーにメッセージを送信するたびに、モジュールはメッセージの種類を判別し、適切な応答を組み立てます。応答は状態に依存することが多いため、各タイプのメッセージを処理する個々の関数間で情報を保持/共有するために必要な場合は、グローバル変数を使用しています。

私が抱えている問題は、アプリケーションが(何らかの理由で)閉じられると、グローバル変数の値が(もちろん)失われるため、アプリケーションを再起動すると、ハンドヘルドと同期しなくなります。回復のためにこれらの値を保存するための信頼できる方法が必要です。

私がこれまで行ってきた方向(ただし、まだ機能していません)は、変数名とその値を、更新されるたびに、ディスク上のCSVファイルに書き込むことです。起動)、そのファイルを探し、それを使用して変数を以前の状態に割り当てます。ファイルの書き込みや読み取りに問題はありませんが、何らかの理由で値が割り当てられていません。

コメント/ヘルプのコードを投稿することはできますが、その前に、そもそもまったく間違った方向に進んでいるかどうかを知りたいと思いました。これらの値を保存および回復するためのより良い(または少なくとも好ましい)方法はありますか?

ありがとう、JDM

====

フォローアップ。ちょっと不格好かもしれませんが、これが私が持っているもので、機能しています。私が気にかけているグローバルは、「CUR_」で始まるグローバルだけです。tempDict1インタプリタが直接反復するのが好きではないように見えるので、私は使用しなければなりませんでしたglobals()

    ピクルスをインポート
    CUR_GLO1 ='valglo1'
    CUR_GLO2 ='valglo2'
    CUR_GLO3 ='valglo3'

    def saveGlobs():
        tempDict1 = globals()。copy()
        tempDict2 = {}
        tempDict1のキーの場合:
            if(key [:4] =='CUR_'):tempDict2 [key] = tempDict1 [key]
        pickle.dump(tempDict2、open('tempDict.p'、'wb'))

    def retrieveGlobs():
        tempDict = pickle.load(open('tempDict.p'、'rb'))
        globals()。update(tempDict)
4

1 に答える 1

2

答えとしてそれを書きます。

あなたがやりたいと思うのは、アプリケーションのチェックポインティングの形式です。

Pickleモジュールを使用すると、 Python変数を簡単に保存およびロードできます。使い方の簡単な例を次に示します。Stackoverflowに関するこの議論このメモは一致しているようですが、私の一部はもっと良い方法があるはずだと考えています。

ちなみに、すべてを辞書に入れる必要はありません。変数を正しい順序でダンプおよびロードし、それを変更しないように注意し、途中にデータを挿入するなど、いくつかの変数をダンプおよびロードするだけで済みます。ただし、辞書を使用すると、順序の依存関係が削除されます。

% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> foo=123
>>> bar="hello"
>>> d={'abc': 123, 'def': 456}
>>> f=open('p.pickle', 'wb')
>>> pickle.dump(foo, f)
>>> pickle.dump(bar, f)
>>> pickle.dump(d, f)
>>> ^D
% python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> f=open('p.pickle','rb')
>>> foo=pickle.load(f)
>>> foo
123
>>> bar=pickle.load(f)
>>> bar
'hello'
>>> d=pickle.load(f)
>>> d
{'abc': 123, 'def': 456}
>>> 
于 2012-12-16T20:20:00.967 に答える