سؤال

I have an object that takes a parameter in the constructor. I was wondering how I can serve this from Pyro4. An Example:

import Pyro4

class MyPyroThing(object):
    def __init__(self, theNumber):
        self.Number = theNumber

Pyro4.Daemon.serveSimple(
    {
        MyPyroThing(): None
    },
    ns=True, verbose=True)

This fails of course because the constructor must have a parameter.

And when this is solved, how do you invoke such object?

theThing = Pyro4.Proxy("PYRONAME:MyPyroThing")

EDIT:

I think this question was not written correctly, see my answer below.

هل كانت مفيدة؟

المحلول

The answers above where not what I was really asking, meaning I explained my question badly. Mea Culpa.

I wanted to invoke an instance on the client. But that is not how Pyro4 works at all. A class in instantiated on the server and this instance is transmitted over the wire.

After mailing Irmin (the original developer) it came clear to me how Pyro4 works.

So, what I do now is use a factory pattern where I ask the factory to give me an instance of an object. For instance:

psf = Pyro4.Proxy("PYRONAME:MyApp.Factories.ProductFactory")
product = psf.GetProductOnButton(buttonNoPressed, parentProductId)

product is an instance of the Product() class. Because the instance is registered in the Pyro daemon, i can call methods on this instance of Product() too. Look at the shoppingcart example to know where I got my eureka moment.

نصائح أخرى

Instead of using Pyro4.Daemon.serveSimple you can:

  • Get the name server using Pyro4.locateNS
  • Create a Pyro4.Daemon object
  • Create the objects you need to expose
  • Use the daemon register method to make them available
  • Use the name server register method to provide a name to uri mapping
  • Start the daemon loop

The code would be more or less as follows:

import Pyro4

name_server = Pyro4.locateNS()
daemon = Pyro4.Daemon()
my_object = MyPyroThing(parameter)
my_object_uri = daemon.register(my_object)
name_server.register('MyPyroThing', my_object_uri)

daemon.requestLoop()

After this, my_object URI will be available in the name server as MyPyroThing.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top