1

pypar と mpich2 を使用して複数のノード間でデータを送信するレガシー python コードがあります。何らかの理由でデータはシェルフに保持され、pypar はシェルフをピクルして他のノードに送信したいと考えています。酸洗い棚は許可されていません。だから私はシェルブから、他のノードに送信する前にそれをピクルするpypar経由で送信できるものに変換したいと考えています。助言がありますか?棚をjsonに変換してピクルできますか?

4

2 に答える 2

1

シェルフを に変換してからdict()、酸洗してみてください。

sdb = shelve.open('foo.db')
sdb['abc'] = {'a': 1, 'b': 2}
tmp = cPickle.dumps(dict(sdb), 2)
print cPickle.loads(tmp)
{'abc': {'a': 1, 'b': 2}}

更新: (コメント内の質問への回答): Adictは任意のマッピング オブジェクトからキー値をコピーできるため、そのオブジェクトがメソッドkeysを実装していれば機能します__getitem__。shelve はマッピング オブジェクトであるため、dictコピー コンストラクターは shelve からキー値を読み取ることができ、結果の dict をピクルして他のホストに送信できます。

dict以下の例は、オブジェクトをコピーするために必要な最小限のインターフェイスを示しています。

class Foo(object):

    def __init__(self):
        self.value = 0

    def keys(self):
        return ['a', 'b']

    def __getitem__(self, key):
        v = self.value
        self.value += 1
        return self.value

foo = Foo()
print dict(foo)
print dict(foo)

出力

{'a': 1, 'b': 2}
{'a': 3, 'b': 4}

更新:辞書の内容をシェルブに追加するには、次を使用しますupdate()

d = {'a': 1, 'b': 2}
s = shelve.open('foo.db')
s.update(d)
print s
{'a': 1, 'b': 2}
于 2011-03-11T03:49:57.933 に答える