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, хотя ваш код не переводится напрямую)