2017-06-26 4 views
0

J'ai un module appelé foobar et il contient un tas de fonctions que je voudrais appeler à distance.Exposer un tas de fonctions à travers Pyro

Ma solution actuelle consiste à emballer toutes ces fonctions comme des méthodes statiques dans une classe et à partager cela.

Voici mon code:

pyro_server.py:

import Pyro4 
import foobar 

import inspect 
Pyro4.config.REQUIRE_EXPOSE = False 

import my_custom_pyro_config as pyro_config 

def module_to_class(module): 
    class Wrapper: 
     pass 
    for name, func in inspect.getmembers(module, inspect.isfunction): 
     setattr(Wrapper, name, staticmethod(func)) 
    return Wrapper 

def main(): 
    name_server = Pyro4.locateNS(host=pyro_config.IP, port=pyro_config.NS_PORT) 
    daemon = Pyro4.Daemon(host=pyro_config.IP, port=pyro_config.PYRO_PORT) 
    foobar_uri = daemon.register(module_to_class(foobar)) 
    name_server.register("foobar", foobar_uri) 
    print("Entering request loop") 
    daemon.requestLoop() 

Il fonctionne, mais il se sent sorte de ... louches

est-il une meilleure façon de le faire? Je suis ouvert à la commutation vers une autre bibliothèque RPC

Répondre

0

Utilisez la fonctionnalité "Flame" de Pyro. Il permet un accès distant direct à un module sur le serveur, sans avoir à exposer les membres manuellement.

>>> import Pyro4.utils.flame 
>>> Pyro4.config.SERIALIZER="pickle" 
>>> fl = Pyro4.utils.flame.connect("localhost:55225") # use whatever location the flame server is running on 
>>> s = fl.module("sys") 
>>> s.stdout.write("foobar\n") 
7  
# ...and observe 'foobar' being written to the server's output 
+0

Remerciements Irmen. Je suppose que je n'ai pas pensé à utiliser la flamme car c'est trop puissant/dangereux/effrayant – user357269

+0

oui c'est, c'est pourquoi envelopper explicitement les choses que vous voulez exposer dans une classe et exporter c'est la route sûre –