Python: 使用 rpyc 进行远程日志记录

Python: remote logging with rpyc

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

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

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

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

顺便说一句,Pyro4 does handle remote iteration correctly,您可以遍历远程迭代器和生成器。 (虽然它的工作方式确实与 rpyc 有点不同,因此您的代码不会直接翻译)