【问题标题】:How to get STDOUT from a QProcess?如何从 QProcess 中获取 STDOUT?
【发布时间】:2011-04-20 15:16:42
【问题描述】:

我以为我会使用以下代码从 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!");

我期望看到程序的输出打印到调试控制台,但我看到的只是:

完成!

我知道:

  • 程序启动正常,因为打印了最后的消息。
  • 程序打印输出,因为在终端中运行完全相同的命令会产生预期的一长串文本。

我在这里做错了什么?

【问题讨论】:

  • 看看这个类似问题的公认答案:stackoverflow.com/questions/2148185/…
  • 这个问题的解决方案也有道理,但它不保持消息的顺序
  • 用语言翻译宏 tr() 封装可执行文件是没有意义的。我也怀疑将可执行文件和参数作为第一个参数是否可行。更好: process.start("php-cgi", QStringList()
  • 如果您不想在 QProcess 运行时阻止您的应用程序,请查看此问题的答案:stackoverflow.com/questions/10098980/…
  • QProcess 不错。 Qt 非常漂亮!

标签: qt process stdout qprocess


【解决方案1】:

这里有一些说明:

根据http://doc.qt.io/qt-5/qprocess.html#ProcessChannelMode-enum

  • QProcess::MergedChannelsQProcess 将正在运行的进程的输出合并到标准输出通道(stdout)。 标准错误通道(stderr)不会接收任何数据。[...]

但是

  • QProcess::ForwardedChannelsQProcess 将正在运行的进程的输出转发到主进程。 任何子进程写入其标准输出和标准错误将写入主进程的标准输出和标准错误

【讨论】:

  • 处理主进程的输出稍微容易一些。所以,谢谢。
【解决方案2】:

在开始您的流程调用之前:

process.setProcessChannelMode(QProcess::MergedChannels);

它将导致将所有内容(甚至是 STDERR 输出)打印到 STDOUT 输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多