2017-06-26 16 views
0

私はfoobarというモジュールを持っていて、それは遠隔から呼びたいたくさんの関数を含んでいます。Pyroを使ってたくさんの関数を公開する

私の現在の解決策は、クラス内のすべての関数を静的メソッドとしてラップして共有することです。

は、ここに私のコードです:

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() 

それは動作しますが、それは一種の危険な感じ...

がこれを行うには良い方法はありますか?別のRPCライブラリに切り替えることができます

答えて

0

Pyroの "Flame"機能を使用してください。モジュールを手動で公開することなく、サーバー上のモジュールに直接リモートアクセスすることができます。

>>> 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

ありがとうIrmen。私はそれがあまりにも強力な/安全でない/恐ろしいので炎を使用するとは思わなかったと思います。 – user357269

+0

はい、それは明示的にあなたがクラスで公開したい、エクスポートするものを安全なルート –

関連する問題