获取要在Qt-widge中显示的子进程的stdout

2024-10-03 11:24:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在一个子进程中将写入stdout的内容显示在Qt小部件中。在

我是这样开始这个过程的:

import subprocess

subprocess.call(["program_name", "arguments"])

我想我必须创建一个类来充当stdout,并在调用subprocess时指出它,我尝试了以下方法:

^{pr2}$

但我收到一个错误消息:AttributeError:'Log'对象没有属性'fileno'

除了重定向到一个文件,然后有一个计时器可以不时地读取文件之外,我真的想不出其他任何想法了。。在

[编辑]

结果是:

process = QProcess()
process.setProcessChannelMode( QProcess.MergedChannels )
process.start( "program_name", [ "arguments" ] )
process.readyReadStandardOutput.connect( aFunction )


# then in the function...

outputBytes = process.readAll().data()
outputUnicode = outputBytes.decode( 'utf-8' )
messageWidget.append( outputUnicode )

谢谢你的帮助!在


Tags: 文件name内容进程部件stdoutprogramqt
1条回答
网友
1楼 · 发布于 2024-10-03 11:24:48

在subprocess模块中重定向输入/输出流的工作级别较低,因此只能传递具有fileno的filelike对象。在

如果要从python读取数据,可以使用^{}而不是subprocess.call,这将以字节的形式返回写入进程的stdout中的数据:

log = subprocess.check_call(["program_name", "arguments"])
...   # use log

或者您可以使用^{}并传递stdout=subprocess.PIPE。然后可以从返回的对象stdout读取数据:

^{pr2}$

在子流程文档中应该有很多示例。在


编辑:

如果需要与Qt进行更紧密的集成,还可以使用^{}来启动程序,而不是使用subprocess模块。这将允许您使用它的read channel的readyRead信号,以便在准备从进程中读取数据时得到通知。在

相关问题 更多 >