Как получить STDOUT из QProcess?

Я думал, что получу результат от QProcess, используя следующий код:

// Start the process
process.start(tr("php-cgi www/test.php"),QIODevice::ReadWrite);

// Wait for it to start
if(!process.waitForStarted())
    return 0;

// Continue reading the data until EOF reached
QByteArray data;

while(process.waitForReadyRead())
    data.append(process.readAll());

// Output the data
qDebug(data.data());
qDebug("Done!");

Я ожидаю увидеть вывод программы, напечатанный на консоли отладки, но все, что я вижу, это:

Сделанный!

Я знаю это:

  • Программа запускается нормально, потому что сообщение в конце печатается.
  • Программа делает вывод на печать, потому что выполнение той же самой команды в терминале выдает длинную строку текста, как и ожидалось.

Что я здесь делаю неправильно?


person Nathan Osman    schedule 04.10.2010    source источник
comment
Посмотрите на принятый ответ на этот аналогичный вопрос: stackoverflow.com/questions/2148185/   -  person Fred    schedule 04.10.2010
comment
Решение в этом вопросе тоже имеет смысл, но не соблюдает порядок сообщений   -  person Kamil Klimek    schedule 06.10.2010
comment
Нет смысла заключать исполняемый файл в макрос языкового перевода tr(). Я также сомневаюсь, что установка исполняемого файла и параметра в качестве первого аргумента сработает. Лучше: process.start(php-cgi, QStringList()‹‹www/test.php,QIODevice::ReadWrite);   -  person Valentin Heinitz    schedule 24.02.2013
comment
Если вы не хотите блокировать свое приложение во время выполнения QProcess, посмотрите ответ на этот вопрос: stackoverflow.com/questions/10098980/   -  person parsley72    schedule 25.01.2014
comment
QProcess — это хорошо. Qt невероятно красив!   -  person Raiden Core    schedule 09.05.2016


Ответы (2)


Перед запуском вызова процесса:

process.setProcessChannelMode(QProcess::MergedChannels);

Это приведет к печати всего (даже вывода STDERR) в вывод STDOUT.

person Kamil Klimek    schedule 04.10.2010

Вот некоторые уточнения:

Согласно http://doc.qt.io/qt-5/qprocess.html#ProcessChannelMode-enum,

  • QProcess::MergedChannels: QProcess объединяет вывод запущенного процесса в стандартный канал вывода (stdout). Канал стандартной ошибки (stderr) не будет получать данные.[...]

но

  • QProcess::ForwardedChannels: QProcess перенаправляет вывод запущенного процесса в основной процесс. Все, что дочерний процесс записывает в свой стандартный вывод и стандартную ошибку, будет записано в стандартный вывод и стандартную ошибку основного процесса.
person Michel L    schedule 30.01.2015
comment
Обработка вывода основного процесса немного проще. Тогда спасибо. - person Subin Sebastian; 19.11.2018