python Popen stderr=PIPE 6000+ строк вызывает зависание
Я запускаю приложение командной строки через Popen в OSX, которое производит много строк чтения командной строки, передавая это через stderr моему окну wx.TextCtrl. Я использую потоки и классы, и все работало нормально, пока я не запустил что-то, что производит тысячи строк, и в этот момент мое приложение работает хорошо, пока оно не зависает в строке 6498, и я не уверен, почему, пожалуйста, какие-нибудь идеи?
self.process1 = Popen(shlex.split(command), shell=False, stderr=PIPE)
while True:
line = self.process1.stderr.readline().decode('utf-8')
wx.CallAfter(self.frame.running_log1.AppendText, line)
self.process1.stderr.flush()
if "Some text" in line:
break
1 ответ
wx.TextCtrl
имеет максимальное количество символов, которые можно добавить в элемент управления. Это зависит от платформы и зависит от встроенного элемента управления, но задокументировано, что оно должно быть не менее 32 КБ.
Вы можете попробовать установить конкретную максимальную длину или делегировать ее собственному элементу управления, установив максимальную длину равной 0. См. Метод SetMaxLength().
Вероятно, вы можете определить, какая текущая максимальная длина установлена, проверив количество байтов, содержащихся в ваших 6000+ строк. Кроме того, вы можете зарегистрировать обработчик событий для wx.EVT_TEXT_MAXLEN(id, func)
Событие, о котором уведомит ваше приложение, пытается превысить лимит.
Все это основано на документации wxWidgets / wxPython, а не на реальном опыте.
КСТАТИ, self.process1.stderr.flush()
ничего не делает, поскольку вы не пишете в свой подпроцесс.