Чтение вывода Asterisk AMI
Никак не могу разобраться как считать вывод ответа на Action из AMI. Например при отправке Action: QueueStatus 
Получить ту информацию что выводится в терминале не получается. Пробовал перед отправкой Action вешать Event Listner, но на вывод ничего не приходит, пример:
client = await self.__ami_service.get_client_by_city(city)
try:
def on_event(event, **kwargs):
test = event.response
client.logoff()
client.disconnect()
client.add_event_listener(on_event=on_event, white_list=['QueueParams', 'QueueMember'])
except:
client.disconnect()
queue_actuon = SimpleAction(
'QueueStatus'
)
result = client.send_action(queue_actuon)
Так же пробовал слушать события и отправлять Action из разных сервисов, но результата так же не получил. Использовался Python 3.8 и библиотека asterisk-ami.
Ответы (1 шт):
Дело оказалось в библиотеке, которая читать и выводить так данные не может. На GitHub в 2018 году подобный вопрос был задан создателям библиотеки и предложены правки, что бы вывод был корректный, но пул реквест завис https://github.com/ettoreleandrotognoli/python-ami/pull/27. Выхода два:
- Скопировать библиотеку, внести туда необходимы правки и пользоваться;
- Использовать пример ниже.
Код в вопросе похож на правду, но в конце необходимо добавить sleep. В итоге пример выглядит так:
def func(queue):
events = []
client = await self.__ami_service.get_client_by_city(city)
try:
def event_listener(event, **kwargs):
events.append(event)
listener = client.add_event_listener(event_listener, white_list=['QueueParams', 'QueueMember', 'QueueEntry'])
client.send_action(SimpleAction('QueueStatus', Queue=queue))
time.sleep(1)
client.remove_event_listener(listener)
except Exception as e:
logger.exception(e)
finally:
client.logoff()
client.disconnect()
del client
return events
Без remove_event_listener, logoff, disconnect и удаление объекта подключения при отправки нескольких комманд подряд начинают сыпаться ошибки. Дальше решил не разбираться.