我有一个名为foobar
的模块,它包含一系列我想远程调用的函数。
我目前的解决方案是将所有这些函数作为静态方法包装在一个类中并共享它。
这是我的代码:
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 :(得分:1)
使用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