У меня есть wx-gui, который является каналом stdout/stderr для двух разных текстовых элементов управления. В программе я создаю процесс для запуска некоторого хрустящего кода кода, и у меня есть поток, который присоединяется к процессу и изменяет глобальное состояние при завершении процесса.Python: установка sys.stdout в wx.TextCtrl с помощью процесса/потока приводит к сбоям
import multiprocessing as mp
from threading import Thread
t = Thread(target=self.join_proc)
self.process = mp.Process(target=self.currentProc.Run, args=(0,))
self.process.start()
t.start()
def join_proc(self):
self.process.join()
self.state.transition(SIMULATION_ACTIVE)
Проблема заключается в том, что первый раз стандартный вывод используется после того, как присоединиться, программа падает в одном из нескольких вариантов, где GTK жалуется/остановить/ошибку сегментации из-за различные ошибки, которые происходят в textctrls, например:
(python:15592): Gtk-WARNING **: Invalid text buffer iterator: either the iterator is
uninitialized, or the characters/pixbufs/widgets in the buffer have been modified
since the iterator was created.
Это пахнет проблемой резьбы, но я не могу понять, как решить эту проблему. Я попытался установить stdout/stderr на значение по умолчанию sys.__std[err|out]__
, пока процесс/поток существует, но это не помогает. В настоящее время у меня есть обертка вокруг textctrls, которая заботится о том, чтобы нарисовать вызов flush() на stdout/stderr, который ничего не делает. Эта функция кажется, что она может содержать решение, то есть флеш до/после выполнения чего-то умного с помощью textctrl.
Как использовать объекты textctrl для его работы? В качестве альтернативы, что является лучшим вариантом для выполнения бит процесса/обратного вызова, чем мой текущий процесс/объединение потоков?
Вы можете получить лучшие результаты, получая выходные данные от дочерних процессов с явными каналами, а не с помощью 'sys' деталей. http://docs.python.org/library/multiprocessing.html#multiprocessing.Pipe – msw