嗨,我正在使用rpyc模块连接到一个远程机器,并在它上执行一些东西。在处理过程中,远程机器可能会记录一些内容,因此我需要将其重定向到本地机器。
为了重定向日志,我遇到了这个奇怪的异常:
import rpyc
c = rpyc.classic.connect("localhost")
l = c.modules["logging"].getLogger("foo")
for h in l.handlers:
print h此循环导致引发异常:
2017-03-19 11:38:29,180 - protocol.py :312 - DEBUG - Exception caught
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/rpyc-3.2.3-py2.7.egg/rpyc/core/protocol.py", line 302, in _dispatch_request
res = self._HANDLERS[handler](self, *args)
File "/usr/lib/python2.7/site-packages/rpyc-3.2.3-py2.7.egg/rpyc/core/protocol.py", line 560, in _handle_callattr
return self._handle_getattr(oid, name)(*args, **dict(kwargs))
StopIteration有人看到我做错了什么吗?为什么我不能在l.handlers上迭代?
发布于 2017-03-19 10:54:01
StopIteration是python在迭代器耗尽元素时引发的异常,消耗它们的循环应该停止(通常)。rpyc似乎没有认识到StopIteration异常的特殊性质,而只是将其抛出为代码崩溃的错误。
解决方案可能是不对远程集合进行迭代,而是首先将其转换为本地集合(如果可能的话)。您可以尝试以下操作(尽管它很可能会与前面的错误一样崩溃,因为将某些内容转换为list也必须对其进行迭代):
local_handlers = list(l.handlers)
for h in local_handlers:
print(h)顺便说一句,Pyro4确实正确地处理远程迭代。,您可以在远程迭代器和生成器上循环。(虽然它的工作方式与rpyc略有不同,但是您的代码不会直接翻译)
https://stackoverflow.com/questions/42885097
复制相似问题