我想从Qt运行一个python脚本。我可以用QProcess
调用它,并让qDebug()
打印python脚本打印的内容。但由于某些原因,我无法在代码中的某一点之后读取python脚本的任何打印内容。在
有人知道怎么解决这个问题吗?提前谢谢你。这是我的第一个问题,如果我做错了什么,我很抱歉。在
我的小工具.cpp文件和python脚本如下。(python脚本在Qt程序的目录中。)
我的小工具.cpp文件:
#include "widget.h"
#include "ui_widget.h"
#include "QDebug"
#include <QTimer>
#include <QProcess>
#include <QDir>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(checkTexts()));
timer->start(5000);
}
Widget::~Widget()
{
delete ui;
}
void Widget::checkTexts()
{
//QProcess process; //I also tried this way with the same results
QProcess *process = new QProcess(this);
QStringList arguments { QCoreApplication::applicationDirPath() + "/../../../../../Folder/Qt Desktop Application/ApplicationFiles/PullText.py"};
process->start("python", arguments);
process->waitForFinished(-1);
QString output = process->readAll();
process->close();
qDebug() << output;
}
我的Python脚本(PullText.py)它应该向Qt应用程序发送一行文本文件:
^{pr2}$
我想你的问题是:
如果您的子进程产生的输出多于一小部分,则调用
waitForFinished()
是有问题的,因为如果您的子进程的stdout
输出缓冲区已满,则会出现死锁情况:子进程/Python进程现在被阻塞,等待缓冲区耗尽,以便它可以向其中写入更多输出;同时,Qt/父进程也被阻塞,等待子进程退出。在因为两个进程都不能做任何事情,所以子进程永远不会退出,因此
waitForFinished()
将永远不会返回,并且您的程序将永远被卡住。在(另一种可能性是,子进程被设置为在其
stdout
缓冲区填满时丢弃任何额外的输出文本;在这种情况下,子进程将退出,waitForFinished()
将返回,但您的process->readAll()
调用将只返回能够放入输出缓冲区的初始输出文本;其余文本被丢弃所以你的Qt进程永远看不到它)在这两种情况下,解决方案都不是在
waitForFinished()
内等待,而是直接调用readAll()
来收集其输出而不需要等待。您可能需要在一个循环中调用它,直到子进程退出为止,可能还需要与waitForReadyRead()
一起调用,以避免繁忙的循环。在相关问题 更多 >
编程相关推荐