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

时间:2017-03-19 09:45:53

标签: python python-2.7 logging io-redirection 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?

1 个答案:

答案 0 :(得分:1)

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

解决方案可能是不迭代远程集合,而是首先将其转换为本地集合(如果可能的话)。您可以尝试以下方法(尽管它可能会因以前出现的错误而崩溃,因为将某些内容转换为list也必须迭代它):

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

顺便说一句,Pyro4 does handle remote iteration correctly,你可以循环远程迭代器和生成器就好了。 (它确实与rpyc有点不同,所以你的代码不能直接翻译)