1

我正在尝试在子进程中写入 stdout 的内容,并显示在 Qt 小部件中。

我以这种方式开始这个过程:

import subprocess

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

我想我必须创建一个类来像标准输出一样,并在我调用子进程时指出它,我试过这个:

class Log:
    def __init__(self, qtWidget):
        self.qtWidget = qtWidget

    def write(self, data):
        self.qtWidget.append(data)


# (...)

log = Log(theWidget)

sub.process.call(["program_name", "arguments"], stdout=log)

但我收到一条错误消息:AttributeError: 'Log' object has no attribute '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 )

谢谢您的帮助!

4

1 回答 1

1

子进程模块中输入/输出流的重定向工作在较低级别,这就是为什么您只能传递具有文件号的类文件对象的原因。

如果你想从 python 读取数据,你可以使用subprocess.check_output而不是subprocess.call,它将以字节的形式返回写入进程的标准输出的数据:

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

或者您可以使用subprocess.Popen并通过stdout=subprocess.PIPE. 然后您可以从返回的对象中读取数据stdout

p = subprocess.Popen(["program_name", "arguments"], stdout=subprocess.PIPE)
log = subprocess.stdout.read()
...   # use log

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


编辑:

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

于 2013-05-27T07:52:23.090 回答