如何使用pexpect在python中获得子进程的自发输出
发布时间:2020-12-20 12:17:24 所属栏目:Python 来源:网络整理
导读:这与我的另一个帖子 multithreading issue with wx.TextCtrl (or underlying GTK+)相关,在经过主要线程调用GUI交互的纠正后,我发现它再次出现在管道块缓冲问题上.那么如何从subprocess.stdout获得自发输出? 简而言之,目前我正在使用subprocess.popen来启动
这与我的另一个帖子
multithreading issue with wx.TextCtrl (or underlying 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) 我使用一个单独的线程来读取后台程序的标准输出,用“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)) 上面的代码打印出子进程日志消息block-hanging-block(而不是逐行自发),最糟糕的是剩下的5-6行日志消息在用户发送下一个输入之前无法及时打印. 从我以前的帖子中,我知道有pty和pexpect,这可能会让子进程认为它与pseudo-tty进行交互.但是如何使用pexpect,特别是考虑到后台进程是长期的,独立的运行任务? 例如,如果我使用过 child=pexpect.spawn(launchcmd) 如何获取子进程的输出和输入,所以我可以使用wx.TextCtrl打印输出,还可以使用wx.TextCtrl将用户输入转发到子进程? 解决方法
你尝试过类似的东西:
child = pexpect.spawn(launchcmd) while True: try: child.expect('n') print(child.before) except pexpect.EOF: break (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |