调用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