如何使用pexpect在python中获得子进程的自发输出

如何使用pexpect在python中获得子进程的自发输出,第1张

概述这与我的另一个帖子 multithreading issue with wx.TextCtrl (or underlying GTK+)相关,在经过主要线程调用GUI交互的纠正后,我发现它再次出现在管道块缓冲问题上.那么如何从subprocess.stdout获得自发输出? 简而言之,目前我正在使用subprocess.popen来启动一个外部长时间运行的程序. launchcmd=["EXTER 这与我的另一个帖子 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
总结

以上是内存溢出为你收集整理的如何使用pexpect在python中获得子进程的自发输出全部内容,希望文章能够帮你解决如何使用pexpect在python中获得子进程的自发输出所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存