2017-03-19 12 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은 반복자가 요소를 다 사용하고이를 사용하는 루프가 중지되어야하는 예외입니다 (일반적으로). rpyc가 StopIteration 예외의 특별한 특성을 인식하지 못하고 대신 코드를 충돌시키는 오류로 throw합니다.

해결 방법은 원격 컬렉션을 반복하지 않고 대신 가능한 경우 로컬 컬렉션으로 전환하는 것일 수 있습니다.

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

덧붙여, Pyro4 does handle remote iteration correctly을 할 수있는 원격 반복자를 통해 루프를 (매우 잘 이전과 같은 오류와 함께 중단 될 수 있지만 list에 뭔가를 변환하는 것은 또한 반복하기 때문에,) 다음을 시도 할 수 있습니다 발전기도 괜찮습니다. (코드가 rpyc와 약간 다르게 작동하므로 코드가 직접 변환되지 않습니다)