Скрипт Python не полностью запускается из Qt - PullRequest
0 голосов
/ 12 мая 2018

Я хочу запустить скрипт на Python из Qt.Я могу вызвать его с помощью QProcess и получить qDebug() для печати того, что печатает скрипт Python.Но по какой-то причине я не могу Qt прочитать какие-либо распечатки скрипта 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 = "***\n"

#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

1 Ответ

0 голосов
/ 13 мая 2018

Я думаю, что ваша проблема здесь:

process->waitForFinished(-1);

Вызов waitForFinished() проблематичен, если ваш дочерний процесс выдает больше, чем небольшое количество вывода, потому что, если stdout выходной буфер вашего дочернего процесса заполняется, у вас возникла тупиковая ситуация: дочерний / Python-процесс теперь блокируется, ожидая, пока буфер опустошится, чтобы он мог записать в него больше выходных данных;Между тем, ваш процесс Qt / parent также блокируется, ожидая завершения дочернего процесса.

Поскольку ни один из процессов не может ничего сделать, дочерний процесс никогда не завершится, поэтому waitForFinished() никогда не вернется, и ваша программазастрял навсегда.

(Другая возможность состоит в том, что дочерний процесс настроен так, чтобы просто отбрасывать любой дополнительный выходной текст, когда его буфер stdout заполняется; в этом случае дочерний процесс завершится, и waitForFinished() будетreturn, но ваш process->readAll() вызов вернет только исходный выходной текст, который смог поместиться в выходной буфер, оставшийся текст был отброшен, так что ваш процесс Qt никогда не увидит его)

В любомВ этом случае решение состоит не в том, чтобы ждать внутри waitForFinished(), а в том, чтобы просто вызвать readAll() немедленно, чтобы собрать результаты без ожидания.Возможно, вам придется вызывать его в цикле, пока не завершится дочерний процесс, возможно, вместе с waitForReadyRead(), чтобы избежать циклов занятости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...