如何将Python控制台输出重定向到QTextBox

如何将Python控制台输出重定向到QTextBox,python,console,qwidget,redirect,Python,Console,Qwidget,Redirect,我正在开发一个用于重新编译Linux内核的GUI。为此,我需要从Python实现4-5个Linux命令。我使用Qt作为GUI设计器。我已经使用os.system()call成功地实现了这些命令。但输出是在控制台获得的。真正的问题是,命令的输出是一个列表,连续打印几乎需要20-25分钟。如何将此控制台输出传输到Qt中设计的文本框。有谁能帮助我在Qt中使用source作为实时控制台输出来实现setSource()操作。我主要处理wxPython,但这是一个可行的解决方案吗 从页面: 问题:是否要运行

我正在开发一个用于重新编译Linux内核的GUI。为此,我需要从Python实现4-5个Linux命令。我使用Qt作为GUI设计器。我已经使用
os.system()
call成功地实现了这些命令。但输出是在控制台获得的。真正的问题是,命令的输出是一个列表,连续打印几乎需要20-25分钟。如何将此控制台输出传输到Qt中设计的文本框。有谁能帮助我在Qt中使用source作为实时控制台输出来实现
setSource()
操作。

我主要处理wxPython,但这是一个可行的解决方案吗

从页面:

问题:是否要运行进程 将大量信息打印到 控制台并以 文本编辑器或浏览器,但结果 是一个GUI,它会冻结到 这个过程结束了

解决方案(多种可能方案之一): 创建QProcess对象,连接其 向你班上的一些插槽发送信号, 将所需的参数和参数传递给它 开始吧。进程标准输出上的数据 然后stderr就会被送到你的插槽中


我想到了使用烟斗。您可以使用后台线程读取程序的输出(并在添加新行时向GUI发送事件)

因此,基本思想是:

os.chdir("/usr/src/linux-2.6.34")

p = os.popen("make", "r")
try:
    while True:
        line = p.readline()
        if not line:
            break

        # Replace this with a GUI update event (don't know anything about Qt, sorry)
        print line
finally:
    # Cf. http://docs.python.org/library/os.html#os.popen
    programReturnValue = p.close() or 0

这对我来说工作做得很好。谢谢大家。

很好的帮助,兄弟,它真的对我有帮助。但是我得到的是关于windows的。我需要使用它进行系统调用。也就是说,它是关于执行一些带有req参数的程序。但是这对兄弟帮助很大,因为我可以找到实现应用程序接口的方法。谢谢你,我试过了,成功地完成了,兄弟。我用了start()来代替closeStdin()它工作得很顺利。谢谢这个主意很好,兄弟,但问题是我不知道线程到目前为止是否能够将正在运行的内容传输出去。因为我不认为我们有足够的时间来更新。但我可以从上面尼克的答案中找到答案。谢谢你帮我养狗。
self.process = QProcess()
self.connect(self.process, SIGNAL("readyReadStdout()"), self.readOutput)
self.connect(self.process, SIGNAL("readyReadStderr()"), self.readErrors)
tarsourcepath="sudo tar xvpf "+ self.path1
self.process.setArguments(QStringList.split(" ",tarsourcepath))
self.process.start()



def readOutput(self):

    self.textBrowser2.append(QString(self.process.readStdout()))
    if self.process.isRunning()==False:
        self.textBrowser2.append("\n Completed Successfully")




def readErrors(self):
    self.textBrowser2.append("error: " + QString(self.process.readLineStderr()))