Как заставить скрипт ждать не блокируя программу и ещё кое что

Всем привет. Я новичок в питон и пока не всё понимаю но пытаюсь разобраться. Суть проблемы вот в чём: есть несколько устройств с которых нужно получать информацию по SSH, условно будет говорить что надо получить серийный номер. Есть скрипт:

import asyncio
import asyncssh
import sys


class MySSHClientSession(asyncssh.SSHClientSession):
    def data_received(self, data, datatype):
        print(data, end='')

    def connection_lost(self, exc):
        if exc:
            print(f'SSH session error: {str(exc)}', file=sys.stderr)

async def getserial(ipaddress, user, password):
    conn, client = await asyncssh.create_connection(asyncssh.SSHClient, host=ipaddress, username=user, password=password, known_hosts=None)
    async with conn:
        chan, session = await conn.create_session(MySSHClientSession, 'show device serial')
        await chan.wait_closed()

async def main(data):
    futures = [
        getserial(ipaddress=data[0]['ip_oam'], user=data[0]['login'], password=data[0]['cli_password']),
        getserial(ipaddress=data[1]['ip_oam'], user=data[1]['login'], password=data[1]['cli_password']),
    ]
    wait_task = await asyncio.gather(*futures)

if __name__ == '__main__':
    devlist = {
        0: {'ip_oam': '192.168.1.5', 'login': 'root','cli_password': '123123'},
        1: {'ip_oam': '192.168.1.51', 'login': 'root','cli_password': '321321'},
    }
    try:
        loop = asyncio.get_event_loop()
        result = loop.run_until_complete(main(devlist))
    except(OSError, asyncssh.Error) as exc:
        sys.exit(f'SSH connect failed: {str(exc)}')

Несколько вопросов. Аппаратура на которую скрипт делает запрос очень специфическая и после входа по ssh есть задержка от 5 до 7 секунд в момент которой терминал просто ничего не делает, а потом выходит приглашение в которое можно будет вводить команды. Если не делать задержку в этот момент, а сразу вводить команды то устройство их просто проигнорирует. Именно так было в варианте с paramiko, там приходится делать time.sleep. Как сделать это в асинхронном варианте скрипта с asyncssh?

Как вывести переменную data в которой хранится вывод запроса ssh в main чтобы дальше использовать этот вывод и парсить ответ от устройства?

Спасибо.


Ответы (1 шт):

Автор решения: eri

Поспать

await asyncio.sleep(7)

но так как штука у нас асинхронная - повесь колбэк на сессию и жди там приглашения от железки. на сессию в инит повесь экземляр self.ready = asyncio.Future() и в колбэке self.ready.set_result(True), ну и потом..

Надо будет перечитать доки, чтоб написать подробнее...

→ Ссылка