Столкнулся с такой проблемой.
Через по SSH делаю подключение и выполняю команду “tailf test.log”
Далее читаю построчно stdout.
Команда print(line) выводит всё корректно, каждую новую появляющуюся строку в файле test.log
Но про попытке записать в виджет TEXT происходит зависание инициализации главного окна.
Если в цикле чтения выполнить stdout.close(), то инициализация проходит успешно и так же выводится первая строка в виджет Text, но, соответственно, дальше всё взрывается, так как файл закрыт.
Пробовал в цикле как сразу же line insert-ить, так и вначале line записывать в переменную, а потом вставлять переменную
Подскажите, как решить данную проблему? К примеру как возобновить чтение stdout в новой итерации, либо как тормозить цикл пока не пройдёт запись.
Появление логов идёт примерно со скоростью 1 строка в секунду, т.е. не льёт как из ведра.
Так же данную проблему воспроизвел на PyQT5. Поведение идентичное.
Так же попытался присвоить значение линии из stdout в переменную по средствам deepcopy(). Результатов нет.
Подскажите как быть?
#python3 from tkinter import * import paramiko host = '127.0.0.1' user = 'user' secret = 'pass' port = 22 def sendtext(event): val = entrytext.get() print(val) def cancel(): a=1 def logs(): for line in stdout: print(line.encode('utf-8')) line1 = line.encode('utf-8') textlog.insert(END,line1) #Вывод главного окна по центру экрана-------------------------------------------------- def center(win): win.update_idletasks() width = win.winfo_width() frm_width = win.winfo_rootx() - win.winfo_x() win_width = width + 2 * frm_width height = win.winfo_height() titlebar_height = win.winfo_rooty() - win.winfo_y() win_height = height + titlebar_height + frm_width x = win.winfo_screenwidth() // 2 - win_width // 2 y = win.winfo_screenheight() // 2 - win_height // 2 win.geometry('{}x{}+{}+{}'.format(width, height, x, y)) win.deiconify() #-------------------------------------------------------------------------------------- #Основной блок. Инициализация окна----------------------------------------------------- logwindow = Tk() #logwindow.overrideredirect(True) logwindow.geometry('1000x800') center(logwindow) scrollbar = Scrollbar(logwindow) textlog = Text(logwindow, width=123,height=47, bg='#000000', fg='#ffffff') textlog.grid(column=0,row=0,columnspan=2,padx=6, pady=6) entrytext = Entry(logwindow,width=148,bg='#000000', fg='#ffffff') entrytext.grid(column=0,row=1,padx=6, pady=6) entrytext.bind('<Return>',sendtext) cancelbutton = Button (logwindow, width = 10, height = 1, text = 'Отменить',command=cancel) cancelbutton.grid(column=1,row=1,padx=6, pady=0) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname=host, username=user, password=secret, port=port) stdin, stdout, stderr = client.exec_command('cd /file/path/ && tailf test.log') logs() client.close() logwindow.mainloop()