Pyside QProcess нужна помощь - PullRequest
1 голос
/ 04 июня 2011

ПРИМЕЧАНИЕ : класс MyWindow (QWidget):

In 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 Ответ

3 голосов
/ 06 июня 2011

Вы должны убедиться, что программа (gcc в этом случае) работает с stdout без буферизации. Большинство консольных приложений буферизуют, за исключением записи в консоль (cmd.exe или терминал), поскольку это повышает производительность. Предположительно, внутренние потоки, используемые Qt для буферизации вывода QProcess ', не рассматриваются как ttys, поэтому вы получаете буферизацию и видите вывод только в конце.

Обычно программы на C могут отключить буферизацию (setvbuf), но большинство этого не делают. Поскольку вам нужно что-то для работы с gcc, который, по-видимому, буферизует не-ttys, вам придется использовать утилиту типа unbuffer. См. этот ответ .

...