pep*_*ero 5 python multithreading wxpython pipe pexpect
这与我在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)
Run Code Online (Sandbox Code Playgroud)
我使用一个单独的线程来读取后台程序的标准输出,用"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))
Run Code Online (Sandbox Code Playgroud)
上面的代码打印出子进程日志消息block-hanging-block(而不是逐行自发),最糟糕的是剩下的5-6行日志消息在用户发送下一个输入之前无法及时打印.
从我以前的帖子中,我知道有pty和pexpect,这可能会让子进程认为它与pseudo-tty进行交互.但是如何使用pexpect,特别是考虑到后台进程是长期的,独立的运行任务?
例如,如果我使用过
child=pexpect.spawn(launchcmd)
Run Code Online (Sandbox Code Playgroud)
如何获取子进程的输出和输入,所以我可以使用wx.TextCtrl打印输出,还可以使用wx.TextCtrl将用户输入转发到子进程?
unu*_*tbu 13
你尝试过类似的东西:
child = pexpect.spawn(launchcmd)
while True:
try:
child.expect('\n')
print(child.before)
except pexpect.EOF:
break
Run Code Online (Sandbox Code Playgroud)