KeyboardInterrupt обработка чрезвычайно медленная. В чем проблема? - PullRequest
0 голосов
/ 16 января 2019

В настоящее время я пытаюсь написать скрипт для чтения оболочки через paramiko, и, безусловно, если я предложу одну команду, она прекрасно работает.

проблема в том, что моя настоящая цель - обработатьпоток отладки и, конечно, я не могу использовать тайм-аут, потому что скрипт должен слушать без ограничений по времени.

Так что другой вариант - позволить пользователю остановить поток с помощью ctrl - c.Я добавил обработчик «try, кроме», например

except (IOError, SystemExit):
    raise
except KeyboardInterrupt:
    print ("Crtl+C Pressed. Shutting down.")

, и казалось, что он не работает: ничего не происходит при нажатии ctrl-c.Но потом я понял, что это заняло вечность: через несколько минут скрипт фактически останавливается и появляется сообщение.

Кто-нибудь знает, как решить эту проблему?

только для справки здесьмой код

import paramiko
import time
import re
import socket
import os

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

address = '192.168.1.1'
username = 'admin' 
password = ''

ssh.connect(address, port=22, username = username, password = password)

shell = ssh.invoke_shell(height=400)
shell.settimeout(2)

def prompt_console(command = '', channel = shell, timeout = False):
    print(channel.recv(9999).decode('utf-8'))           #<-- this is for removing the initial prompt from buffer
    if timeout == False:
        shell.settimeout(3600)                          #<--increasing the timeout
    channel.send(command+'\n')
    log = ''
    while True:
        try:
            log += channel.recv(1).decode('utf-8')      #<--every loop it loads a char into the "log" variable
            if log[-9:] == '--More-- ':
                shell.send(" ")
                log.replace('--More-- \r         \r\t\t','\r\t\t')
            if len(re.findall('.*\n',log))>0:           #<--it yields every line to python console
                yield log
                log = ''
        except (IOError, SystemExit):
            raise
        except KeyboardInterrupt:
            print ("Crtl+C Pressed. Shutting down.")

Я также пытался поместить попытку - за исключением цикла while, но он не работал.Я также перепробовал множество предложений, которые нашел в Google, но они тоже не сработали: все они в конечном итоге останавливают скрипт, но для всех это занимает 5-10 минут.

...