python pexpect输出_关于多线程:如何使用pexpect获取python中子进程的自发输出
这与我使用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)
我使用一个单独的线程读取后台程序的标准输出,并使用" 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))
上面的代码打印出子进程日志消息的块挂起的块(而不是自发地一行一行),最糟糕的是直到用户发送下一个输入之前,其余5-6行的日志消息才被及时打印。
从我的旧文章中,我知道有pty和pexpect,这可能使子流程认为它正在与伪tty交互。但是应该如何使用预期,特别是考虑到后台进程是长期的,独立运行的任务呢?
例如,如果我使用
child=pexpect.spawn(launchcmd)
如何获得子流程的输出和输入,因此我可以使用wx.TextCtrl打印输出,还可以使用wx.TextCtrl将用户输入转发到子流程?
您是否尝试过类似的方法:
child = pexpect.spawn(launchcmd)
while True:
try:
child.expect('
')
print(child.before)
except pexpect.EOF:
break
我花了30分钟的时间尝试生成所有的读取命令。 甚至从未见过before属性。 祝您一切顺利。
我认为更优雅的解决方案是使用child.logfile属性。
我发现这两种方法都能很好地获得实时输出。
如果您不希望用户进行交互,例如在后台流程中:
child = pexpect.spawn(launchcmd)
child.logfile = sys.stdout
child.expect(pexpect.EOF)
child.close()
如果您不使用后台进程,并且希望能够与该程序进行交互(如果它提示您)。 在这里发生的是,您进入了交互模式,并且pexpect直接写入屏幕。 程序运行结束/ EOF时,将引发OSError。
child = pexpect.spawn(launchcmd)
try:
child.interact()
except OSError:
pass
child.close()
python pexpect输出_关于多线程:如何使用pexpect获取python中子进程的自发输出相关推荐
- python看门狗(watchdog)、多线程、实现文件夹实时监听、日志输出、备份
python看门狗(watchdog).多线程.实现文件夹实时监听.日志输出.备份 代码展示 import _thread from watchdog.observers import Observe ...
- python 编程效率_如何有效提升数据分析效率?五大Python技巧
如何有效提升数据分析效率?相信这是所有数据分析工作者都想解决的问题.本文整理了五大python技巧,分别是Pandas Profiling:使用 Cufflinks 和 Plotly 绘制 Panda ...
- python 字符串拼接_面试官让用 3 种 python 方法实现字符串拼接 ?对不起我有8种……...
点击上方 蓝字关注我们 点击上方"印象python",选择"星标"公众号重磅干货,第一时间送达!之前发过很多关于 Python 学习的文章,收到大家不少的好评, ...
- python 建筑计算_制图小技巧:巧用Python和ELK瞬间完成总图建筑名称标注
哎呦,又到了每周一次的制图教室啦.经过前面两次制图教程的分享,相信大家对于白模填色和写实渲染这两种表达方式肯定有了较好的掌握. 那么今天我们就转战制图技巧篇,和童鞋们聊一下总平面图中的建筑名称标注问题 ...
- python树代码_浅析AST抽象语法树及Python代码实现
在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码.树上的每个 ...
- python入门教授_南开大学教授强力推荐的5本Python入门书籍,附电子版
筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. python现在的主流版本是3.7(有明显性能提升,强烈推荐) 3.6, 不基于这两个或者更新版本的书,慎重选择.很多库已经不提供py ...
- 熊猫的python小课_朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!...
Print( ) 详细请见公众号文章,里面有让人印象深刻,无法忘记的灵魂画手的图画解释.朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!mp.weixin.qq.com 人类有人类 ...
- python控制灯泡_人工智能应用-手把手教你用Python硬件编程实现打开或关闭电灯泡...
之前我们已经给广大爱好者或程序员朋友们,带来了硬件版的或者说物联网版本的Hello World C++Builder版.Delphi.Visual Basic.Net等的程序源码和教学资料,让大家对硬 ...
- python ide 最好_我在iPad上最好的Python IDE
python ide 最好 Having finished my first year at university, and being left with very little to do thi ...
最新文章
- Caused by: java.lang.NoClassDefFoundError: redis/clients/util/Pool
- Java基础点:集合
- Android 屏幕防偷窥,华为Mate30怎么设置防偷窥 AI智能防偷窥功能使用方法
- SharePoint 2013 自定义扩展菜单(二)
- 2017菜鸡C与C++工程师总结,撸码撸码,垃圾专科生撸码人生
- 【C语言进阶深度学习记录】六 C语言中的分支语句
- SQLite3中的数据类型
- 用什么PHP框架最好?框架?还不如用开源系统吧
- 项目管理学习总结(5)——产品开发过程中各角色职责说明和技能要求
- 新版macbook,PPT导出PDF复制文字乱码问题的解决
- Linux系统下安装ssh服务
- 用什么c语言语句直接跳出if,C语言中怎样跳出if语句
- #读书笔记# 《人类简史》Chapter4
- CAP MAP VLR HLR GMSC DP gsmSSF简介
- 使用PfamScan的API对蛋白结构域进行注释
- RealPlayer 11 简体中文最新正式版下载
- 程序猿家养变色龙食用指南
- Element输入框带历史查询记录
- 使用Arduino IDE的ESP32电容式触摸传感器引脚
- 带有 JavaScript 的井字游戏:带有 Minimax 算法的 AI 玩家
热门文章
- django使用mysql事务处理_Django中MySQL事务的使用
- springMVC 控制层添加异步线程
- java.util.function.Function的用法
- springboot前端传参date类型后台处理方式
- Java面试——Spring系列总结
- java判断对象无数据_java 对象属性不能为空判断
- stm32的语音识别_基于stm32循迹避障语音控制金属探测蓝牙小车设计(原理图+pcb+源码+参考文档)...
- 易语言php支付宝,支付宝填表登录易语言源码
- vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...
- php实现小说字典功能_PHP实现生成数据字典功能示例