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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么定义!doctype html表格高度变高,!DOCTYPE html声明下div高度100%的问题解决方法...

在使用HTML代码创建网页,如果声明了,并且在代码中有div设置了高度为100%,可能会出现显示不正常的情况。比如下面这个代码:Title* {margin:0px;padding:0px;}div {background-color:red;width:200px;height:100%;}显示的结果是:啥都…

已知等价关系求商集_等价关系习题.docx

习题十:等价关系与等价类‘‘1.设R和R是集合A上的等价关系,用例子证明R R不一定是等价关系。2.试问由4个元素组成的有限集上所有的等价关系的个数为多少3.给定集合S{1,2,3,4&#…

计算机显示文本自定义130%,实训课题目

WINDOWS7上机操作题一、在D盘根目录上建立一个文件夹,文件夹的名字为自己的名字“_win7_09”,完成后文件夹名如“张三_win7_09”。完成作业后将所有结果放在文件夹下,并将文件夹压缩成一个压缩文件上传。1、设置在不同窗口中打开不…

sqlplus中调用shell_记一次突破反弹shell

这是 酒仙桥六号部队 的第 106 篇文章。全文共计1809个字,预计阅读时长6分钟。背景某天闲着无聊,小伙伴发来一个某网站,说只能执行命令,不能反弹shell。测试对着目标站点一顿测试。发现确实存在shiro反序列化,并且存在…

计算机专业简历推荐信范文,个人简历自我推荐信范文【三篇】

【导语】自我推荐信在个人简历中是一个比较重要的环节,一般自荐信简单抓住重点就行了。以下是无忧考网为大家精心搜集和整理的个人简历自我推荐信范文,希望大家喜欢!【篇一】尊敬的领导:您好!衷心感谢您能在百忙之中抽出宝贵的时间…

scrapy获取a标签的连接_Python爬虫 scrapy框架初探及实战!

Scrapy框架安装操作环境介绍操作系统:Ubuntu19.10Python版本:Python3.7.4编译器:pycharm社区版安装scrapy框架(linux系统下)安装scrapy框架最繁琐的地方在于要安装很多的依赖包,若缺少依赖包,则scrapy框架的安装就会报错。不过ana…

怎么用计算机计算年月份,如何使用Excel计算两个日期之间的月数?

一、这可以通过DATEDIF函数完成。二、 DATEDIF函数的定义DATEDIF函数是Excel中的隐藏函数,而不是帮助和插入公式中的隐藏函数。返回两个日期之间的年\月\日间隔的数量。 DATEDIF函数通常用于计算两个日期之间的时差。语法DATEDIF(开始日期,结束日期&…

卖金鱼的地方_1个水族店,5个周转箱,卖鲫鱼和泥鳅,老板对水族的热爱

大家好,欢迎来到一二水族。从北京回到邯郸老家,才让我有了大开眼界的感觉,为什么这么说呢?以前经常去大型观赏鱼市场,见到的都是高级海缸,大型草缸,或者雨林缸,一直陶醉在这样的氛围…

为什么计算机关机慢,电脑关机慢是什么原因 电脑关机慢的原因【图文】

使用过电脑的朋友都知道,在初期电脑关机是相当的快的,可是使用越久就会发现,电脑的关机速度减慢了许多,平时只需要30秒那样就可以关机了,到了最后居然要一分多钟关个电脑,为什么关机的时间变慢了呢?为什么…

mirna富集分析_经验之谈丨生信分析文章套路原来这么简单!

近两年,不做实验或者仅需要少量实验的生物信息学分析文章,发表量越来越多。如果利用数据库检索,高效的发出一篇文章。是科研工作者关注的话题,今天我们就用一篇生信分析的文章作为切入点,来谈谈生信分析文章的套路。1.…

计算机内存比外存容量大吗,内存容量一般比外存容量大吗

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。内存容量一般比外存容量大。计算机的内存容量通常是指随机存储器(RAM)的容量,是内存条的关键性参数。内存容量以MB作为单位,可以简写为M。内存的容量一般都是…

vscode的eslint无效_vscode配置eslint自动保存功能不生效

今天给一个项目添加eslint, 按照网上的教程,配置完就是不生效,半天没解决, 后来终于解决了, 在此总结,把一些坑分享出去。1. vscode 扩展中安装eslint2. eslint 扩展要是开启状态(开启关闭如果没生效,重启v…

计算机数日期,计算机如何计算两个日期之间的天数

计算机是如何计算两个日期之间的天数的,这个问题看起来好像很简单,但是仔细一想,好像还没那么简单,月与月之间天数不一样,平年和闰年也会影响天数。举个例子:2017年2月1日-2017年6月1日中间有多少天&#x…

a jquery 标签点击不跳转_form标签的action属性怎么用?form标签action属性的用法介绍(附实例)...

本篇文章主要的介绍了关于HTML中form标签action属性的用法介绍和实例,还有关于form标签的action属性的定义和语法介绍,最后徐还有关于form标签的action属性的作用解释。现在让我们一起来看吧。我们先来介绍HTML中form标签的action属性的含义:…

计算机屏幕亮度调到多少合适,电脑屏幕的亮度和对比度调到多少比较合适,对眼睛伤害最小?有哪位高手了解?...

选购液晶电视的八大关注事项:1、留意显示尺寸是否齐全:现在液晶电视的主流尺寸基本上都是27英寸、32英寸和37英寸,这些已经能够满足客厅以及卧室的观看需求,但这里要提醒一下,最好是购买产品线比较丰富的品牌&#xff…

后发送过慢的问题_点胶阀使用常见问题怎么解决

点胶阀是在点胶作业中必不可少的配件之一,在点胶过程中点胶阀遇到问题该怎么解决呢,今天阿莱思斯给大家进行分析。1.点胶阀无法停胶问题:a.点胶阀中转杆或密封装置磨损。b.点胶阀的供给气压无法打开2.点胶阀针头滴胶,主要是以下几…

dns备用服务器信息,dns服务器地址(dns首选和备用填多少)

dns服务器地址DNS是计算机域名体系(DomainNameSystem或DomainNameService)的缩写,它是由解析器以及域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功用的服务器。其中域名有必要对应一个IP地址&am…

接口传值后不起作用_前端工程师吐后端工程师(第八讲)——接口的开发

上一讲我们介绍了如何写让模板变量在页面上展示,本讲我们介绍一下后端开发工作中最常用的功能——接口。创建一个go_test4文件夹,然后把go_test3中的代码复制进去。然后打开main.go文件,进行更改。说到接口就必不可少的涉及到传值和接口返回&…

css选择器按功能分,CSS 选择器

概览在 CSS 中,选择器用于选择需要添加样式的元素。CSS 选择器非常丰富,现将 CSS 1 - 3 目前所有的选择器列举如下。选择器例子例子描述CSS版本.class.intro选择 class"intro" 的所有元素。1#id#firstname选择 id"firstname" 的元素…

tensor数据类型转换_PyTorch的tensor数据类型及其相关转换

1 基本类型PyTorch的数据类型为各式各样的tensor,tensor可以理解为高维矩阵,与Numpy中的array类似。PyTorch中的tensor包括CPU上的数据类型和GPU上的数据类型。Torch定义了七种CPU tensor类型和八种GPU tensor类型。通过使用type函数可以查看变量类型&am…