2017-03-19 25 views
0

こんにちは私はrpycモジュールを使ってリモートマシンに接続し、いくつかのものを実行しています。処理中に、リモートマシンはいくつかのものをログに記録して、ローカルマシンにリダイレクトする必要があります。Python:rpycによるリモートロギング

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 

は、誰もが私が間違ってやって見ているん:

import rpyc 


c = rpyc.classic.connect("localhost") 
l = c.modules["logging"].getLogger("foo") 

for h in l.handlers: 
    print h 

は、このループは、例外を発生させる原因となる:私はこの奇妙な例外が発生しましたログをリダイレクトする試みで

? l.handlersを反復処理できないのはなぜですか?

答えて

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とは少し違いますが、コードは直接翻訳されません)