Python: удаленная регистрация с помощью 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 ответ

Решение

StopIteration это исключение, которое вызывается python в тот момент, когда у итератора заканчиваются элементы, и цикл, который их потребляет, должен быть остановлен (обычно). Похоже, что Rpyc не признает особую природу StopIteration исключение и вместо этого просто выдает его как ошибку, которая приводит к сбою кода.

Решение может заключаться в том, чтобы не выполнять итерацию по удаленной коллекции, а вместо этого сначала превратить ее в локальную коллекцию, если это вообще возможно. Вы можете попробовать следующее (хотя это может привести к сбою с той же ошибкой, что и раньше, потому что преобразование чего-либо в list также должен перебрать его):

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

Кстати, Pyro4 правильно обрабатывает удаленные итерации, вы можете просто зацикливаться на удаленных итераторах, а также на генераторах. (Он работает немного иначе, чем rpyc, хотя ваш код не переводится напрямую)

Другие вопросы по тегам