2011-06-26 10 views
7

Używam biblioteki, która zapewnia interfejs Pythona do zewnętrznego programu. To pozwala mi utworzyć:Python: jak udostępnić instancję obiektu przez wiele wywołań skryptu

foo = Foo() 

Powyższy kod uruchamia nową instancję programu Foo, którą mogę kontrolować z poziomu Pythona.

Mam skrypty Pythona, które muszą być wywoływane wiele razy iw zależności od parametrów zewnętrznych, powiedz pojedynczej instancji zewnętrznego programu Foo, aby zrobić różne rzeczy. Oczywiste, że nie może zrobić

foo = Foo() każdym razem,

ponieważ tworzy nową instancję Foo za każdym razem mój skrypt działa.

To, co chcę zrobić, to jednorazowo utworzyć foo= Foo() i mieć wiele inwokacji współużytkować to samo wystąpienie. Obecnie jestem po prostu tworzenia go raz, serializacji go, a moje skrypty deserializacji go. Czy to podejście działa? Czy istnieje lepsza alternatywa?

Dzięki!

Odpowiedz

3

Można to zrobić, postępując zgodnie z podejściem podobnym do podanego w this answer. Lub możesz użyć Pyro, która jest porównywana do wieloprocesowości w this answer.

0

Być może będziesz mógł używać pickle. Oto prosty przykład:

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

Próbowałem to faktycznie zrobić, otrzymałem komunikat "Nie mogę się pozbyć obiektu" lock ": ". Teraz się nad tym zastanawiam. – wk1989

+0

Tak, ma ograniczenia, których możesz/nie możesz wykonywać, aby robić to, co chcesz: http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled – zeekay

+2

jeśli używasz blokady, prawdopodobnie musisz wziąć inną ścieżkę, taką jak gniazda lub potoki, aby zapewnić zablokowany dostęp do klasy – lunixbochs

0

można zmienić projekt tak, że Foo() tylko łączy Cię do istniejącego procesu, a następnie utworzyć nową funkcję, nazwać startFoo() że wcześniej zadzwonić raz (lub jeśli Foo() nie) . Jeszcze lepiej byłoby uczynić program, który Foo() łączy się z usługą, z którą łączysz się przez gniazdo. Możesz także przełączyć się na moduł przetwarzania wieloprocesowego.

+0

Tak, myślę, że to właśnie będę musiał zrobić widząc, ponieważ nie mogę serializować obiektu Foo z łatwością. – wk1989

Powiązane problemy