Python脚本不能完全从Q运行

2024-09-29 02:21:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从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}$

Tags: 工具脚本ui内容newincludewidgetthis
1条回答
网友
1楼 · 发布于 2024-09-29 02:21:38

我想你的问题是:

process->waitForFinished(-1);

如果您的子进程产生的输出多于一小部分,则调用waitForFinished()是有问题的,因为如果您的子进程的stdout输出缓冲区已满,则会出现死锁情况:子进程/Python进程现在被阻塞,等待缓冲区耗尽,以便它可以向其中写入更多输出;同时,Qt/父进程也被阻塞,等待子进程退出。在

因为两个进程都不能做任何事情,所以子进程永远不会退出,因此waitForFinished()将永远不会返回,并且您的程序将永远被卡住。在

(另一种可能性是,子进程被设置为在其stdout缓冲区填满时丢弃任何额外的输出文本;在这种情况下,子进程将退出,waitForFinished()将返回,但您的process->readAll()调用将只返回能够放入输出缓冲区的初始输出文本;其余文本被丢弃所以你的Qt进程永远看不到它)

在这两种情况下,解决方案都不是在waitForFinished()内等待,而是直接调用readAll()来收集其输出而不需要等待。您可能需要在一个循环中调用它,直到子进程退出为止,可能还需要与waitForReadyRead()一起调用,以避免繁忙的循环。在

相关问题 更多 >