前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >扩展和嵌入Python之C++程序中嵌入Python解释器

扩展和嵌入Python之C++程序中嵌入Python解释器

作者头像
用户5908113
发布2019-07-30 15:36:21
1.6K0
发布2019-07-30 15:36:21
举报
文章被收录于专栏:Pou光明

大家好,我又回来了!

貌似和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 <QDebug>

#include <python3.5/Python.h>

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. 程序运行结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Pou光明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档