2011-06-26 10 views
7

私は外部プログラムにPythonインタフェースを提供するライブラリを使用しています。これは私が作成することができます:Python:スクリプトの複数の呼び出しでオブジェクトインスタンスを共有する方法

foo = Foo() 

上記のコードは、私がPython内から制御できるFooプログラムの新しいインスタンスを開始します。

私はPythonスクリプトを複数回呼び出す必要があり、外部パラメータに応じて、外部のFooプログラムの1つのインスタンスに異なることを伝えます。それはFooの私のスクリプトを実行するたびに新しいインスタンスを作成しますので、明白な私は

foo = Foo()毎回、

を行うことはできません。

私がしたいことは、foo= Foo()を一度作成し、複数の呼び出しが同じインスタンスを共有することです。現在、私はそれを一度作成してシリアライズし、スクリプトをデシリアライズすることを考えています。このアプローチは機能しますか?よりよい選択肢がありますか?

ありがとうございます!

答えて

3

これは、this answerに示されている方法と同様の方法を実行すると実行できます。またはPyroを使用することができます。これは、this answerのマルチプロセッシングと比較されます。

0

pickleを使用することができます。ここでは簡単な例です:

import os, pickle 

class Foo(object): 
    def __init__(self, bar): 
     self.bar = bar 

# use previous pickled instance if found 
if os.path.exists('foo.pickle'): 
    with open('foo.pickle') as f: 
     foo = pickle.load(f) 
else: 
    foo = Foo(42) 

# print current foo.bar 
print foo.bar 

# change foo.bar and pickle 
foo.bar = raw_input('new bar: ') 
with open('foo.pickle', 'w') as f: 
    pickle.dump(foo, f) 
+0

私はそれを実際にやってみました。「pickleロックできません」というメッセージが表示されました。私は今それを調べている。 – wk1989

+0

ええ、それはあなたが望むことをするために回避することができないかもしれません:http://docs.python.org/library/pickle.html#what-c​​an-be-pickled-and-unpickled – zeekay

+2

ロックを使用している場合は、クラスにロックされたアクセスを提供するために、ソケットやパイプのような別のパスを取る必要があるかもしれません。 – lunixbochs

0

Foo()だけで、既存のプロセスに接続します、そしてあなたは以前に一度(またはFoo()が失敗した場合)を呼び出すことstartFoo()を呼び出し、新しい関数を作成するようにするには、デザインを変更することができます。さらに良い点は、Foo()がソケット経由で接続するサービスに接続するというプログラムを作ることです。また、マルチプロセッシングモジュールに切り替えることもできます。

+0

Fooオブジェクトを直列化できないため、簡単に。 – wk1989

関連する問題