Python脚本没有';不能从Qt完全运行

Python脚本没有';不能从Qt完全运行,python,c++,qt,Python,C++,Qt,我想从Qt运行一个python脚本。我可以使用QProcess调用它,并获得qDebug()以打印python脚本打印的内容。但由于某些原因,我无法在代码中的某个点之后读取任何python脚本的打印 有人知道如何解决这个问题吗?事先非常感谢你。这是我的第一个问题,如果我做错了,我很抱歉 下面是我的widget.cpp文件和python脚本。(python脚本位于Qt程序的目录中。) My widget.cpp文件: #include "widget.h" #include "ui_widget.

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

有人知道如何解决这个问题吗?事先非常感谢你。这是我的第一个问题,如果我做错了,我很抱歉

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

My 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;
}
#包括“widget.h”
#包括“ui_widget.h”
#包括“QDebug”
#包括
#包括
#包括
Widget::Widget(QWidget*父项):
QWidget(母公司),
ui(新ui::小部件)
{
用户界面->设置用户界面(此);
QTimer*定时器=新的QTimer(此);
连接(计时器、信号(超时())、此、插槽(检查文本());
定时器->启动(5000);
}
小部件::~Widget()
{
删除用户界面;
}
void小部件::checktext()
{
//QProcess process;//我也尝试过这种方法,但结果相同
QProcess*process=新的QProcess(此);
QStringList参数{QCoreApplication::applicationDirPath()+“/../../../../../../../../Folder/Qt桌面应用程序/ApplicationFiles/PullText.py”};
进程->开始(“python”,参数);
流程->等待完成(-1);
QString输出=进程->readAll();
进程->关闭();

qDebug()我想你的问题在这里:

process->waitForFinished(-1);
调用
waitForFinished()
如果子进程产生的输出多于少量,则会出现问题,因为如果子进程的
stdout
输出缓冲区填满,则会出现死锁情况:子进程/Python进程现在被阻塞,等待缓冲区耗尽,以便它可以向其中写入更多输出;同时,您的Qt/parent进程被关闭也被阻止,正在等待子进程退出

由于两个进程都不能执行任何操作,子进程将永远不会退出,因此
waitForFinished()
将永远不会返回,并且您的程序将永远被卡住

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


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

如果手动运行python脚本,它是否有效?如果在第二次打印之前出错,您将看不到输出
文件。关闭
文件。关闭()
?当我单独运行python脚本时,它运行正常。很抱歉,file.close是我问题中的一个打字错误。@Johnny这是唯一的印刷错误?我想不会再有这种类型的错误了,因为它们会导致无聊,我们不愿意帮助您,您可以指出项目路线之间的关系构建文件夹和你的.py文件我尝试了这个
process->start(“python”,参数);而(true){process->waitForFinished();QString output=process->readAll();如果(output!=”){qDebug()尝试用完整路径名替换“text.txt”(例如“/Users/Johnny/Documents/text.txt”如果是这样,那么问题是你的Qt应用程序的当前目录与text.txt所在的目录不同,因此open()命令失败。用完整路径名替换“text.txt”修复了它!非常感谢。
process->waitForFinished(-1);