Задача состоит не в том, чтобы вызывать методы другого процесса, а в том, чтобы перенаправить стандартный вывод другого процесса обратно в родительский процесс через события «update», периодически запускаемые при выполнении процесса.
Одним из решений является использование wx.Timer для периодического опроса выходного потока процесса, чтобы мы не полагались на EVT_IDLE, чтобы выполнить работу за нас (у меня были проблемы с запуском EVT_IDLE)
class BuildProcess(wx.Process):
def __init__(self, cmd, notify=None):
wx.Process.__init__(self, notify)
self.Redirect()
self.cmd = cmd
self.pid = None
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.on_timer)
def start(self):
wx.PostEvent(self, BuildEvent(EVT_BUILD_STARTED, self))
self.pid = wx.Execute(self.cmd, wx.EXEC_ASYNC, self)
self.timer.Start(100)
def on_timer(self, evt):
stream = self.GetInputStream()
if stream.CanRead():
text = stream.read()
wx.PostEvent(self, BuildEvent(EVT_BUILD_UPDATE, self, data=text))
def OnTerminate(self, *args, **kwargs):
print "terminating..."
stream = self.GetInputStream()
if stream.CanRead():
text = stream.read()
wx.PostEvent(self, BuildEvent(EVT_BUILD_UPDATE, self, data=text))
if self.timer:
self.timer.Stop()
wx.PostEvent(self, BuildEvent(EVT_BUILD_FINISHED, self))
С помощью этого метода каждые 100 мс выходной поток считывается, упаковывается и отправляется как событие сборки.