qt调用python脚本并获取控制台输出 最好简单好用的方式 qt通过process调用程序并获取输出字符+ 故障bug报错问题

调用python脚本

经过踩坑无数,发现QProcess是最好的是实现方式。本方法windows/linux/mac 通用
其实不只是python,什么程序其实都可以。
首先确定本地已经安装好python环境,并知道python程序路径。
下面代码中包含两种方式

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QtDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

     process1 = new QProcess(this);
//方式一:首先调用控制台,再通过控制台启动程序。(控制台:mac/linux下调用bash,windows下是cmd.exe)
     process1->start("bash");//调用控制台程序
     process1->waitForStarted();//等待程序确实启动再往下走
     process1->write("ls\n");//输入查看当前目录的命令试试。加\n代表控制台中都回车。(查看当前目录命令:linux是 ls,windows 是dir)
     //启动python程序,运行指定py脚本。
     process1->write("/anaconda3/envs/AutoPilotServer/bin/python3.6 /Users/microduino/test000.py \n");
//方式2
     process1->start("/anaconda3/envs/AutoPilotServer/bin/python3.6");//直接启动python程序,而不是通过bash。
     process1->waitForStarted();//等待程序确实启动
     process1->write("/Users/microduino/test000.py \n");//输入python命令,要求他启动指定脚本。

	//信号槽连接,一旦获取到程序输出就调用OnReadData函数
     connect(process1,SIGNAL(readyReadStandardOutput()),this,SLOT(OnReadData()));
}

void MainWindow::OnReadData(){
	//打印出输出
    QString strResult = QString::fromLocal8Bit(process1->readAllStandardOutput().data());
    qDebug() << strResult;
}

MainWindow::~MainWindow()
{
	//别忘了 杀死调用的进程
    process1->kill();
    process1->close();
    delete  process1;
    delete ui;
}

输出问题

值得指出的是,这里输出的内容,是当前py脚本运行结束后,有输出才会出发。比如脚本中有个循环10次每秒输出print,这里就不会触发10次分别打出print,而是会等10次运行结束后,统一打出文本。 。
解决办法,如果要想收到控制台的每次输出,可以再py脚本中将输出保存到内存中,或是剪切板,或者是指定的log文件,然后再通过qt读取,获取每次输出。

报错处理

记录使用qt调用anoconda中的python 发生的问题们

故障1
D:\Anaconda3\envs\AutoPilot\include\object.h:448: error: expected unqualified-id before ';' token
     PyType_Slot *slots; /* terminated by slot==0. */
                       ^

问题成因:

python中object库中的slots与qt中的关键字重合。slots是qt重要关键字,负责处理插槽功能。

解决办法:

打开python根目录/include/object.h文件 将问题代码slots 改为pySlots。以后在qt中调用python的slots时改用pySlots

故障2
F:\tools\qt\Tools\mingw730_64\lib\gcc\x86_64-w64-mingw32\7.3.0\include\c++\cmath:1136: error: '::hypot' has not been declared
   using ::hypot;
           ^~~~~

问题成因:

pyconfig 的 header file里hypot 被重命名为了 _hypot 。而 cmath 调用了 hypot

解决办法:

把include“math.h”放在include“Python”之前
在Python.h 开头加上math.h

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千年奇葩

从来没受过打赏,这玩意好吃吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值