0

嗨,我正在使用 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?

4

1 回答 1

1

StopIteration是当迭代器用完元素并且应该停止消耗它们的循环时python引发的异常(通常)。似乎 rpyc 无法识别异常的特殊性质,StopIteration而是将其作为导致代码崩溃的错误抛出。

一个解决方案可能是不迭代远程集合,而是首先将其转换为本地集合(如果可能的话)。您可以尝试以下操作(尽管它很可能会因与以前相同的错误而崩溃,因为将某些内容转换为 alist也必须对其进行迭代):

local_handlers = list(l.handlers)
for h in local_handlers:
    print(h)

顺便说一句,Pyro4 确实可以正确处理远程迭代,您可以循环遍历远程迭代器和生成器就可以了。(虽然它的工作方式与 rpyc 有点不同,所以您的代码不会直接翻译)

于 2017-03-19T10:54:01.003 回答