与QProcess Python程序通信

Communicating with QProcess Python program

本文关键字:通信 程序 Python QProcess      更新时间:2023-10-16

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

但是,即使是这个简单的例子似乎也不起作用。这两个 python 片段:

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::P rocessState(Running(",但我似乎无法将python的打印输出输入到Qt中。同样,我尝试使用 QProcess::write(( 函数写入 python 进程,但这也不起作用。

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

问题似乎是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");