我有一个导入特定模块的RpyC服务器,应该公开这个模块中的一个类,这样就可以从客户端继承这个类。
出于测试目的,我删除了导入/公开模块,并在我的RPyC服务中创建了一个名为exposed_TestClass的简单类。
服务器端: rpyc_server.py
import rpyc
from rpyc.utils.server import ThreadedServer
class MyService(rpyc.Service):
class exposed_TestClass:
def exposed_Exec(self):
print("original print of class")
t = ThreadedServer(MyService, port=12345)
t.start()客户端: python3外壳
>>> import rpyc
>>> conn = rpyc.connect("localhost", 12345)
>>> conn.root.TestClass
<class 'exposed_TestClass'>
>>> conn.root.TestClass()
<exposed_TestClass object at 0x7f2dda642588>
>>> #calling the Exec function also works, prints at server side
>>> conn.root.TestClass().Exec()
>>>
>>>
>>> # test inheriting class
>>> class MyClass(conn.root.TestClass):
... def NewMethod(self):
... print("printing from new method")
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/rpyc/core/netref.py", line 220, in method
return syncreq(_self, consts.HANDLE_CALLATTR, name, args, kwargs)
File "/usr/lib/python3/dist-packages/rpyc/core/netref.py", line 74, in syncreq
conn = object.__getattribute__(proxy, "____conn__")
AttributeError: 'str' object has no attribute '____conn__'发布于 2020-11-20 04:54:42
根据关于:https://rpyc.readthedocs.io/en/latest/tutorial/tut2.html的文档
netrefs (网络引用,也称为透明对象代理)是一些特殊的对象,它们将在本地完成的所有操作委托给相应的远程对象。Netrefs可能不是真正的函数或模块列表,但它们“尽了最大努力”来查看和感觉它们指向…的对象。事实上,他们甚至愚弄了python的内省机制!
在客户端,如果您这样做了:
import rpyc
conn = rpyc.connect("localhost", 12345)
o=conn.root.TestClass()
type_o = type(o)
print(type_o)它将打印出来:
<netref class 'rpyc.core.netref.__main__.exposed_TestClass'>因此,当试图做:
class MyClass(type_o):
def NewMethod(self):
print("printing from new method")您继承的是代理类定义,而不是远程类定义。所以当文档声明
他们“尽力而为”
,我认为它排除了从远程类进行继承的可能性。如果有人能找到满足你要求的方法,我会非常高兴的。
请注意,我通过使用以下行设置服务器进行了测试:
t = ThreadedServer(MyService, port=12345, protocol_config={ 'allow_all_attrs': True })https://stackoverflow.com/questions/64755053
复制相似问题