与QProcess Python程序通信

时间:2017-05-09 01:56:13

标签: 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 *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();
}

不打印任何东西。它确实说过程是&#34; QProcess :: ProcessState(Running)&#34;,但我似乎无法将python的打印输出转换为Qt。同样地,我尝试使用QProcess :: write()函数写入python进程,但这也不起作用。

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

1 个答案:

答案 0 :(得分:1)

问题似乎是 import httplib2 from google.appengine.api import memcache def getStudentList(course=None, credentials=None, pageToken=None, students=None): http = httplib2.Http(cache=memcache) auth_http = credentials.authorize(http) service = build("classroom", "v1", http=auth_http) params = {} params["courseId"] = course["classroomId"] params["pageSize"] = 50 if pageToken: params["pageToken"] = pageToken studentList = service.courses().students().list(**params).execute() for student in studentList['students']: students.append(student['profile']['emailAddress']) pageToken = studentList.get('nextPageToken') if pageToken: return deferred.deferr(getStudentList, course, credentials, pageToken, students) # There are no more students for this class. # TODO: store students for course 缓冲python(它没有行缓冲)的方式。如果我将脚本更改为...

,您发布的代码适合我
stdout

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

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

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

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