与 QProcess Python 程序通信

Posted

技术标签:

【中文标题】与 QProcess Python 程序通信【英文标题】:Communicating with QProcess Python program 【发布时间】:2017-05-09 01:56:12 【问题描述】:

我正在尝试让 Qt 应用程序与 python 程序进行通信。最合乎逻辑的解决方案似乎是在包含 Python 代码的 Qt 应用程序中运行 QProcess。我想使用标准输入发送命令,如果适用,通过标准输出读取。

但是,即使是这个简单的示例似乎也不起作用。这两个python sn-ps:

import os
import time

while True:
    print "test"
    time.sleep(2)

连同简单的Qt代码:

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)

    process = new QProcess(this);
    process->start("/home/user/test.py");

    connect(process, SIGNAL(stateChanged(QProcess::ProcessState)), SLOT(printProcessStatus()));
    connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(printProcessError()));
    connect(process, SIGNAL(readyRead()), SLOT(printProcessOutput()));


void MainWindow::printProcessStatus()

    qDebug() << process->state();


void MainWindow::printProcessError()

    qDebug() << process->errorString();


void MainWindow::printProcessOutput()

    qDebug() << process->readAll();

不打印任何东西。它确实说该过程是“QProcess::ProcessState(Running)”,但我似乎无法将打印输出从 python 获取到 Qt。同样,我尝试使用 QProcess::write() 函数写入 python 进程,但这也不起作用。

这不是使用 QProcess 的预期方式吗?有没有更好的方法在 Qt 应用程序和(子)python 程序之间进行通信?

【问题讨论】:

那是我代码中变量的名称。为了便于说明,我将一些明确的名称更改为更通用的名称。 尝试将connect 语句放在 调用start 之前——您可能会丢失一些信号。 它确实添加了“开始”状态,但它仍然没有每 2 秒提供“测试”的预期输出。 python 代码显示的是完整的脚本吗?我在顶部没有看到任何 #!/usr/bin/python 或类似名称。如果在命令行中执行test.py 会发生什么? 我使用的 shebang 是 #!/usr/bin/env python2(这里建议 ***.com/questions/6908143/…)。我已授予文件执行权限(chmod +x),它在终端中执行时会打印预期的输出。 【参考方案1】:

问题似乎是python 缓冲stdout 的方式(它不是行缓冲的)。如果我将脚本更改为...,您发布的代码对我有用。

#!/usr/bin/env python2
import os
import sys
import time

while True:
    print "test"
    sys.stdout.flush()
    time.sleep(2)

可能有更好的方法来实现同样的事情,而不必不断地显式刷新流。

或者,如果您在 Linux 上,您可以使用 stdbuf 来控制脚本的输出缓冲。将进程启动命令改为...

process->start("stdbuf", QStringList() << "--output=L" << "/home/user/test.py");

【讨论】:

太棒了!感谢您弄清楚这一点,刷新标准输出对于我的用例来说已经足够了!

以上是关于与 QProcess Python 程序通信的主要内容,如果未能解决你的问题,请参考以下文章

如何将 qprocess 带到最前面?

Qt技巧:QProcess与外部程序的调用

使用QProcess和VS C ++进行实时通信时出现问题

Qt 应用程序之间通过 QProcess 进行通信

QProcess与外部程序的调用(可以通过设置管道来交互)

从 Qt 应用程序设置 Linux 主卷