Я работаю над приложением в wxPython, которое представляет собой графический интерфейс для утилиты командной строки.В графическом интерфейсе есть текстовый элемент управления, который должен отображать вывод из приложения.Я запускаю команду оболочки с использованием подпроцесса, но не получаю от нее никакого вывода, пока она не завершится.
Я пробовал несколько решений, но ни одно из них, похоже, не работает.Ниже приведен код, который я использую в данный момент (обновлено):
def onOk(self,event):
self.getControl('infotxt').Clear()
try:
thread = threading.Thread(target=self.run)
thread.setDaemon(True)
thread.start()
except Exception:
print 'Error starting thread'
def run(self):
args = dict()
# creating a command to execute...
cmd = ["aplcorr", "-vvfile", args['vvfile'], "-navfile", args['navfile'], "-lev1file", args['lev1file'], "-dem", args['dem'], "-igmfile", args['outfile']]
proc = subprocess.Popen(' '.join(cmd), shell=True, stdout=subprocess.PIPE, stderr.subprocess.PIPE)
print
while True:
line = proc.stdout.readline()
wx.Yield()
if line.strip() == "":
pass
else:
print line.strip()
if not line: break
proc.wait()
class RedirectInfoText:
""" Class to redirect stdout text """
def __init__(self,wxTextCtrl):
self.out=wxTextCtrl
def write(self,string):
self.out.WriteText(string)
class RedirectErrorText:
""" Class to redirect stderr text """
def __init__(self,wxTextCtrl):
self.out.SetDefailtStyle(wx.TextAttr())
self.out=wxTextCtrl
def write(self,string):
self.out.SetDefaultStyle(wx.TextAttr(wx.RED))
self.out.WriteText(string)
В частности, мне понадобится вывод в реальном времени для создания индикатора выполнения.
Изменить: я изменил свой код, основываясь на предложении Майка Дрисколла.Иногда кажется, что это работает, но большую часть времени я получаю одну из следующих ошибок:
(python: 7698): Gtk-CRITICAL **: gtk_text_layout_real_invalidate: утверждение `layout-> wrap_loop_count== 0 'не удалось
или
(python: 7893): Gtk-WARNING **: неверный итератор текстового буфера: либо итератор неинициализирован, либо символы/ pixbufs / widgets в буфере были изменены с момента создания итератора.Вы должны использовать метки, номера символов или номера строк, чтобы сохранить положение между изменениями буфера.Вы можете применять теги и вставлять метки, не делая недействительными ваши итераторы, но любая мутация, которая влияет на содержимое «индексируемого» буфера (содержимое, на которое можно ссылаться смещением символов), сделает недействительными все ожидающие итераторы Ошибка сегментации (дамп ядра)
Есть какие-нибудь подсказки?