Python脚本无法从Qt完全运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python脚本无法从Qt完全运行相关的知识,希望对你有一定的参考价值。

我想从Qt运行一个python脚本。我可以用QProcess调用它并获取qDebug()来打印python脚本打印的内容。但由于某些原因,我无法在代码中的某个点之后读取任何python脚本的打印件。

有谁知道如何解决这个问题?非常感谢你提前。这是我的第一个问题,所以如果我做错了,我很抱歉。

我的widget.cpp文件和python脚本如下。 (python脚本位于Qt程序的目录中。)

我的widget.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应用程序:

newMessageSplitter = "***
"

#print "1" #this prints in the qDebug() << output

file = open("texts.txt","r")

#print “2” #this doesn't print

texts = file.read()

x = texts.find(newMessageSplitter) + len(newMessageSplitter)
singleLine = texts[:x-len(newMessageSplitter)]
file.close()
file = open("texts.txt","w")
file.write(texts[x:])
file.close()

#print singleLine #this is what I want to send to the output but it doesn't get sent to Qt
答案

我认为你的问题在这里:

process->waitForFinished(-1);

如果您的子进程产生的输出数量超过少量,则调用waitForFinished()会出现问题,因为如果您的子进程的stdout输出缓冲区填满,则会出现死锁情况:现在阻止了子/ Python进程等待缓冲区耗尽,以便它可以写更多的输出;同时,您的Qt /父进程也被阻止,等待子进程退出。

由于这两个进程都无法执行任何操作,因此子进程永远不会退出,因此waitForFinished()永远不会返回,并且您的程序将永远停留。

(另一种可能是子进程被设置为在其stdout缓冲区填满时简单地丢弃任何其他输出文本;在这种情况下,子进程将退出并且waitForFinished()将返回,但是您的process->readAll()调用将仅返回初始输出文本能够适应输出缓冲区;剩下的文本被丢弃,所以你的Qt进程永远不会看到它)

在任何一种情况下,解决方案都不是在waitForFinished()内部等待,而是立即调用readAll()来收集其输出而无需等待。您可能需要在循环中调用它,直到子进程退出,可能还有waitForReadyRead()以避免繁忙循环。

以上是关于Python脚本无法从Qt完全运行的主要内容,如果未能解决你的问题,请参考以下文章

从 C++/Qt 程序在 Windows 中运行 Anaconda 脚本

在 matplotlib 内联和 QT 后端之间切换 Python 脚本

QProcess 执行 python3 脚本无法正常工作

常用python日期日志获取内容循环的代码片段

Qt编译生成的exe无法执行

无法从 Ansible Playbook 中运行 Python 脚本