与 QProcess Python 程序通信
Communicating with QProcess Python program
我正在尝试让 Qt 应用程序与 python 程序通信。最合乎逻辑的解决方案似乎是 运行 Qt 应用程序中包含 Python 代码的 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::ProcessState(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");
我正在尝试让 Qt 应用程序与 python 程序通信。最合乎逻辑的解决方案似乎是 运行 Qt 应用程序中包含 Python 代码的 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::ProcessState(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");