Python中文
首页
教程
问答
标签
搜索
登录
注册
如何在python中使用pexpect获得子进程的自发输出
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>这与我的另一篇文章<a href="https://stackoverflow.com/questions/4183404/multithreading-problem-with-wx-textctrl-or-underlying-gtk">multithreading issue with wx.TextCtrl (or underlying GTK+)</a>有关,在更正了从主线程调用GUI交互之后,我发现它再次出现了管道块缓冲问题。那么如何从subprocess.stdout获得自发输出呢?</p> <p>简而言之,目前我正在使用subprocess.popen启动一个外部的长时间运行程序。</p> <pre><code> 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) </code></pre> <p>我用一个单独的线程来读取后台程序的stdout,用“wx.CallAfter”来回拨。</p> <pre><code>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.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>Text(line)) </code></pre> <p>上面的代码打印出子流程日志消息块挂起块(而不是自发的逐行打印),最糟糕的是剩下的5-6行日志消息无法及时打印,直到用户发送下一个输入。</p> <p>从我以前的文章中,我了解到有pty和pexpect,这可能使子流程认为它与伪tty交互。但是应该如何使用pexpect,特别是考虑到后台进程是长期的、独立运行的任务?</p> <p>例如,如果我使用</p> <pre><code>child=pexpect.spawn(launchcmd) </code></pre> <p>如何获取子流程的输出和输入,以便可以使用wx.TextCtrl打印输出,还可以使用wx.TextCtrl将用户输入转发到子流程?</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>你有没有试过类似的方法:</p> <pre><code>child = pexpect.spawn(launchcmd) while True: try: child.expect('\n') print(child.before) except pexpect.EOF: break </code></pre>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
在python3中使用Scipy pearsonr函数
10 回答
在Python3中使用scipy对多个lorentzian进行数据拟合
8 回答
在Python3中使用Script=argv
3 回答
在python3中使用selenium webdriver进行未解析的回溯
8 回答
在python3中使用selenium和phantomjs的网页截图之前如何等待?
10 回答
在Python3中使用Selenium和Requests模块从网页获取文件
2 回答
在python3中使用SIGINT终止函数
6 回答
在Python3中使用SIGTERM时,允许进程完成而不是中断
2 回答
在python3中使用smtplib发送XML内容
8 回答
在python3中使用socket库(RFCOMM模式)重新连接蓝牙设备?
5 回答
在python3中使用sounddevice和numpy编写wav文件
5 回答
在python3中使用Sqlalchemy插入MySQL查找类型错误的原因
6 回答
在python3中使用sqlite、pandas和sqlalchemy很难让rollback工作
9 回答
在python3中使用SQLite的FTS3/4
1 回答
在Python3中使用struct.calcsize()和len()有区别吗?
3 回答
在python3中使用substring函数时发生TypeError
1 回答
在Python3中使用Tkinter entry小部件写入串行设备
4 回答
在python3中使用tkinter时,如何在每次按下函数时获得运行该函数的按钮?
2 回答
在python3中使用tkinter的子帧
10 回答
在Python3中使用tryexcept块时,如何避免使用未初始化的变量?
2 回答