Это связано с моей другой публикацией проблема многопоточности с wx.TextCtrl (или лежащим в основе GTK +) , которая после исправления с вызовом взаимодействий GUI из основного потока, я считаю, что она снова приходит к проблеме буферизации конвейерного блока , Так как получить спонтанный вывод из subprocess.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 строк сообщений журнала не могут быть своевременно напечатаны, пока пользователь не отправит следующий вход.
Из моего старого поста я узнал, что есть pty и pexpect, которые могут заставить подпроцесс думать, что он взаимодействует с псевдо-tty. Но как использовать pexpect, особенно учитывая, что фоновый процесс - это долгосрочное, независимое выполнение задачи?
например, если я использовал
child=pexpect.spawn(launchcmd)
Как я могу получить выходные данные и входные данные подпроцесса, чтобы я мог использовать wx.TextCtrl для печати выходных данных, а также использовать wx.TextCtrl для пересылки пользовательского ввода в подпроцесс?