Pyside QProcess需要帮助

时间:2011-06-04 04:28:03

标签: python pyside qprocess

注意:类MyWindow(QWidget):

init

self.proc = QtCore.QProcess(self)
self.te   = QTextEdit(self)
self.btn  = QPushButton("Execute", self)
self.btn.clicked.connect(self.__event_btn)

现在我有了这个:

def __event_btn(self):
    w_dir = "" # This set to my working directory where my C files are
    args  = ["-o", "MyFile", "MyFile.c"]
    cmd   = "gcc"

    self.proc.setWorkingDirectory(dir)
    self.proc.readyReadStandardOutput.connect(self.__read)
    self.proc.closeWriteChannel()
    self.proc.setReadChannel(QtCore.QProcess.StanfardOutput())
    self.proc.start(cmd, args)

def __read(self):
    self.te.setText(self.proc.readAllStandardOutput)

在完成执行过程之前,上面的代码不会显示任何内容。

现在我的问题是,有没有办法可以从gcc中捕获输出并在TextEdit中显示它们,而不是等待进程完成? (cmd.exe或teminal的方式。它们在程序运行时显示输出)

由于

- 标记

1 个答案:

答案 0 :(得分:3)

您需要确保程序(在这种情况下为gcc)运行stdout unbuffered。除非写入控制台(cmd.exe或终端),否则大多数控制台应用程序都会缓冲,因为这会提高性能。据推测,Qt用来缓冲QProcess'输出的内部流不被视为ttys,这就是为什么你得到缓冲并且最后才看到输出。

通常可以使C程序关闭缓冲(setvbuf),但大多数都不这样做。由于您需要使用gcc来处理非ttys的事件,因此您必须使用像unbuffer这样的实用程序。请参阅this answer