как использовать pexpect для получения спонтанного вывода подпроцесса в python

Это связано с другим моим сообщением , проблема многопоточности с wx.TextCtrl (или лежащим в его основе GTK +) , которая после исправления с вызовом взаимодействий с графическим интерфейсом пользователя из основного потока , Я обнаружил, что снова возникает проблема с буферизацией блоков каналов. Итак, как получить спонтанный вывод из подпроцесса. stdout?

Короче говоря, в настоящее время я использую subprocess.popen для запуска внешней долгосрочной программы.

    launchcmd=["EXTERNAL_PROGRAM_EXE"]
    p = subprocess.Popen(launchcmd, stdin=subprocess.PIPE, 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    self.outputThread = BashProcessThread(p.stdout.readline)
    self.outputThread.start()
    # wx.TextCtrl is used to make input/output
    self.textctrl = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER|wx.TE_MULTILINE)

И я использую отдельный поток для чтения стандартного вывода фоновой программы с "wx.CallAfter" для обратного вызова.

class BashProcessThread(threading.Thread):
    def __init__(self, readlineFunc, textctrl):
        threading.Thread.__init__(self)
        self.readlineFunc = readlineFunc

    def run(self):
        while True:
           line = self.readlineFunc()
           wx.CallAfter(textctrl.AppendText(line))

Приведенный выше код распечатывает сообщения журнала подпроцесса блок-висящий-блок (вместо спонтанной строки за строкой), и хуже всего то, что оставшиеся 5-6 строк сообщений журнала не могут быть своевременно напечатаны до тех пор, пока пользователь не отправит следующее input.

Из моего старого сообщения я узнал, что есть pty и pexpect, которые могут заставить подпроцесс думать, что он взаимодействует с псевдо-tty. Но как использовать pexpect, особенно если учесть, что фоновый процесс является долгосрочной, независимой выполняющейся задачей?

например, если бы я использовал

child=pexpect.spawn(launchcmd)

Как я могу получить выходные и входные данные подпроцесса, чтобы я мог использовать wx. TextCtrl для печати вывода, а также с помощью wx.TextCtrl для перенаправления пользовательского ввода в подпроцесс?

5
задан Community 23 May 2017 в 12:11
поделиться