MonkIncr
@MonkIncr

Как получить stdout в реальном времени, а не по окончании обработки команды (python3 pyqt/pyside subprocess)?

Пишу программу, запускающую rsync.

Программа имеет два класса: Rsync, MyGUI

Сам запуск производится так
self.command = [
            "/usr/bin/rsync",
другие параметры,
            ]

cmd = list(self.command)

p = subprocess.Popen(cmd,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)


Ответ выводится через
for line in p.stdout:

в конце итерации
p.stdout.flush()

имеется текстовая область
self.runningEdit = QtGui.QTextEdit()

пытаюсь посылать туда текст через
self.runningEdit.append(x)

Но текст появляется целиком и только когда процесс полностью завершится, при том если следующей инструкцией выводить текст через print(), то все нормально, выводится построчно в консоль.

Подскажите как исправить, если необходимо предоставлю исходник.
  • Вопрос задан
  • 3542 просмотра
Пригласить эксперта
Ответы на вопрос 2
MonkIncr
@MonkIncr Автор вопроса
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = MyGUI()
    
    login = "login"
    server = "x.x.x.x"
    src = "/home/***/rsync/"
    dst = "/srv/***/remote"
    rs = Rsync(ex, login, server, src, dst)
    ex.button_connect(rs)

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()


Спасибо, посмотрю.
Ответ написан
Комментировать
MonkIncr
@MonkIncr Автор вопроса
Вполне возможно, что это неправильно, но так как сам print(x) находится в функции, в классе MyGUI, а вызов происходит из цикла в классе Rsync, и происходит вывод на консоль, а в QtGui.QTextEdit() данные через append(x) не обновляются, то временно решено принудительно перерисовывать окно.

Для этого использовался self.repaint(). self.update() не помог.

Popen.communicate() не помог.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы