大家好,我又回来了!
貌似和python结下了不解之缘,最近主要在做python的扩展和嵌入。
在正式写代码之前,先唠叨几句环境的搭建。当时搭建环境的时候也是费了一番辛苦。【叹气】
在嵌入和扩展Python时,需要调用python的c api,则需要包含Python.h,若想成功的将其包含,需要安装python dev。Ok,终于成功包含了Python.h,然后你欢天喜地的去运行程序了,发现编译不过去。亲,不要沮丧,离成功只差一步了,你只再需要编译和链接一下。当时我自己也是在茫茫互联网上搜索的啊~这部分主要看Python的官方文档。
OK,接下来说下我的运行环境:ubuntu 14.04(32位),Qt Creator, Python3.5。
一、环境搭建
1. 安装python dev,这部分不做详细介绍。
2. 为嵌入python解释器,编译和链接python的c动态库。
①编译时
python3.5-config --cflags
②链接时
python3.5-config --ldlags
Qt .pro里面的配置如图,需将终端显示的都复制下来。
二、测试程序编写
想在python里面调用自己命名并且自己编写的函数么?那接下来就得看看了~
老规矩,先上程序:
Widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
double add(double x, double y)
{
double sum = 0.0;
sum = x + y;
return sum;
}
static PyObject*
add(PyObject *self, PyObject *args)
{
(void)self;
PyObject *pArgs = NULL;
double x = 0.0, y = 0.0;
double result = 0.0;
if (!PyArg_ParseTuple(args,"dd",&x,&y))
{
Py_INCREF(Py_None);
pArgs = Py_None;
}
else
{
result = add(x,y);
pArgs = Py_BuildValue("d", result);
}
return pArgs;
}
static PyMethodDef MathMethods[] = {
{"add", add, METH_VARARGS,"add."},
{NULL, NULL, 0, NULL}
};
static PyModuleDef MathModule = {
PyModuleDef_HEAD_INIT, "dahe", NULL, -1, MathMethods,
NULL, NULL, NULL, NULL
};
static PyObject*
PyInit_math(void)
{
return PyModule_Create(&MathModule);
}
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pbn_runPython_clicked()
{
qDebug() << "enter python !";
PyImport_AppendInittab("dahe", &PyInit_math);
Py_Initialize();
if (!Py_IsInitialized())
{
qDebug() << "inital faild!";
}
PyRun_SimpleString("import os");
PyRun_SimpleString("print (os.getcwd())");
PyRun_SimpleString("import dahe");
PyRun_SimpleString("exec(open('dhTest.py', encoding = 'utf-8').read())");
Py_Finalize();
}
1. 程序说明
点击按钮,触发槽函数执行,运行python c api。从脚本文件中传入参数、计算、打印结果。
①要调用python的C api,需要包含Python.h
②double add(double x, double y)这个函数是python要调用的函数,我们编写的很多程序是为了传递参数和进行错误处理。结合上之前用Qt创建共享库,这里也可以调用共享库的函数。
③在调用c api前,需要先初始化python解释器,使用完成后要释放解释器。说明一点,python3中在初始化解释器前,要将自己编写的模块进行注册。
④PyRun_SimpleString()函数可直接运行python的语句,简单使用时,常用的api不是特别多。
⑤python api中我获得了python当前的执行路径,运行了一个dhTest.py的python文件。
⑥更多信息需要参考python官网
2. 程序运行结果
大家如果觉得还阔以,请关注下方公众号~