2011-06-26 7 views
7

Uso una biblioteca que proporciona una interfaz de python a un programa externo. Esto me permite crear:Python: cómo compartir una instancia de objeto a través de múltiples invocaciones de un script

foo = Foo() 

El código anterior se inicia una nueva instancia del programa Foo que puedo controlar desde dentro de pitón.

Tengo scripts de python que deben invocarse varias veces y, dependiendo de parámetros externos, indicar a una sola instancia del programa Foo externo que haga cosas diferentes. Obvio que no puedo hacer

foo = Foo() cada vez,

ya que crea una nueva instancia de Foo cada vez que mi script se ejecuta.

Lo que quiero hacer es crear foo= Foo() una vez, y hacer varias invocaciones para compartir la misma instancia. Actualmente estoy pensando en crearlo una vez, serializarlo y hacer que mis scripts lo deserialicen. ¿Funciona este enfoque? ¿Hay una mejor alternativa?

Gracias!

Respuesta

3

Esto se puede hacer si sigue un enfoque similar al dado en this answer. O puede usar Pyro, que se compara con el multiprocesamiento en this answer.

0

Es posible que pueda utilizar pickle. Aquí hay un ejemplo simple:

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

Intenté hacer eso, recibí un mensaje que decía "No se puede encurtir el objeto 'bloquear': ". Estoy investigando ahora. – wk1989

+0

Sí, tiene limitaciones que puede/no ser capaz de evitar para hacer lo que desee: http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled – zeekay

+2

si está usando un candado, probablemente necesite tomar otro camino como zócalos o tuberías para proporcionar acceso bloqueado a su clase – lunixbochs

0

Puede cambiar el diseño para que Foo() simplemente se conecta a un proceso existente, y luego crear una nueva función, lo llaman startFoo() que anteriormente se llama una vez (o si Foo() falla) . Aún mejor sería hacer que el programa que Foo() conecta con un servicio al que se conecta a través de un socket. Es posible que también desee cambiar al módulo de multiprocesamiento.

+0

Sí, creo que eso es lo que tendré que hacer ya que no puedo serializar el objeto Foo fácilmente. – wk1989

Cuestiones relacionadas