Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与QProcess Python程序通信_Python_C++_Qt_Ipc_Qprocess - Fatal编程技术网

与QProcess Python程序通信

与QProcess Python程序通信,python,c++,qt,ipc,qprocess,Python,C++,Qt,Ipc,Qprocess,我正在尝试让一个Qt应用程序与python程序通信。最合理的解决方案似乎是在包含Python代码的Qt应用程序中运行QProcess。我想使用std输入发送命令,如果适用,通过std输出读取 然而,即使是这个简单的例子似乎也不起作用。以下是两个python代码片段: import os import time while True: print "test" time.sleep(2) 连同简单的Qt代码: MainWindow::MainWindow(QWidget *pa

我正在尝试让一个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();
}
MainWindow::MainWindow(QWidget*父项)
:QMainWindow(父级)
{
流程=新的QProcess(此);
进程->开始(“/home/user/test.py”);
连接(进程,信号(stateChanged(QProcess::ProcessState)),插槽(printProcessStatus());
连接(进程,信号(错误(QProcess::ProcessError)),插槽(printProcessError());
连接(进程、信号(readyRead())、插槽(printProcessOutput());
}
void主窗口::printProcessStatus()
{
qDebug()状态();
}
void MainWindow::printProcessError()
{
qDebug()错误字符串();
}
void MainWindow::printProcessOutput()
{
qDebug()readAll();
}
没有打印任何东西。它确实说该进程是“QProcess::ProcessState(Running)”,但我似乎无法将python打印的输出输入到Qt中。类似地,我尝试使用QProcess::write()函数来写入python进程,但这也不起作用


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

问题似乎在于
python
buffers
stdout
的方式(它没有行缓冲)。如果我将脚本更改为

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

while True:
    print "test"
    sys.stdout.flush()
    time.sleep(2)
可能有更好的方法来实现同样的事情,而不必不断地显式刷新流

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

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

process->start(“stdbuf”,QStringList()这是我代码中变量的名称。为了便于说明,我将一些显式名称更改为更通用的名称。请尝试在调用
start
之前放置
connect
语句——您可能缺少一些信号。它确实添加了“Starting”状态,但仍然没有提供“test”eve的预期输出ry 2秒。python代码显示的是完整的脚本吗?我在顶部没有看到任何
#!/usr/bin/python
或类似内容。如果在命令行执行
test.py
,会发生什么情况?我使用的shebang是#!/usr/bin/env python2(如这里所建议的)。我已授予文件执行权限(chmod+x)当在终端中执行时,它会打印出预期的输出。太棒了!谢谢你弄明白了这一点,刷新stdout对于我的用例来说已经足够了!