将Python代码嵌入C++程序进行编写的实例


Posted in Python onJuly 31, 2015

把python嵌入的C++里面需要做一些步骤

    安装python程序,这样才能使用python的头文件和库
    在我们写的源文件中增加“Python.h”头文件,并且链入“python**.lib”库(还没搞清楚这个库时静态库还是导出库,需要搞清楚)
    掌握和了解一些python的C语言api,以便在我们的c++程序中使用

常用的一些C API函数

在了解下面的函数之前有必要了解一下**PyObject***指针,python里面几乎所有的对象都是使用这个指针来指示的。
Py_Initialize()&&Py_Finalize()

    在调用任何python的c函数之前需要调用的函数,“Py_Initialize”是用来初始化python模块的,推测是加载初始化加载dll的。对应的在使用python模块之后用“Py_Finalize”来释放模块。

PyImport_ImportModule()

    用来载入一个python模块,这个模块就是一般的python文件。这里需要注意的是,在加载这个模块的时候会执行模块里面所有可以执行的语句。包括import导入语句和在函数体之外的所有语句

PyObject_GetAttrString()

    返回模块里面的函数

Py_BuildValue()

    建立一个参数元组,一般都是用这个函数来建立元组,然后将这个元组作为参数传递给python里面的函数。

PyEval_CallObject()

    调用函数,并把“Py_BuildValue”建立的元组作为参数传递给被调用的函数

源码实例

下面的实例是在c++代码中调用Python的函数,传递参数并且获取返回值

test.cpp代码

#include <iostream>
#include <Python.h>
using namespace std;

int main(int argc, char* argv[])
{
  Py_Initialize();  //初始化

  PyObject* pModule = NULL;
  PyObject* pFunc = NULL;
  PyObject* pParam = NULL;
  PyObject* pResult = NULL;
  const char* pBuffer = NULL;
  int iBufferSize = 0;

  pModule = PyImport_ImportModule(“test_python");

  if (!pModule)
  {
    cout << "get module failed!" << endl;
    exit (0);
  }

  pFunc = PyObject_GetAttrString(pModule, "main");
  if (!pFunc)
  {
    cout << "get func failed!" << endl;
    cout << int(pFunc) << endl;
    exit (0);
  }
  pParam = Py_BuildValue("(s)", "HEHEHE");
  pResult = PyEval_CallObject(pFunc,pParam);
  if(pResult)
  {
    if(PyArg_Parse(pResult, "(si)", &pBuffer, iBufferSize))
    {
      cout << pBuffer << endl;
      cout << iBufferSize << endl;
    }
  }
  Py_DECREF(pParam);
  Py_DECREF(pFunc);

  Py_Finalize();
  //cout << "hello" << endl;
  return 0;
}

test_python.py代码

def main(szString):
  return ("hello", 5)
Python 相关文章推荐
开始着手第一个Django项目
Jul 15 Python
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
Python并发之多进程的方法实例代码
Aug 15 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 Python
Python中断多重循环的思路总结
Oct 04 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
tensorflow之并行读入数据详解
Feb 05 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
Python collections模块的使用方法
Oct 09 Python
详解python的super()的作用和原理
Oct 29 Python
Python制作数据导入导出工具
Jul 31 #Python
简单理解Python中的装饰器
Jul 31 #Python
python简单分割文件的方法
Jul 30 #Python
Python读取网页内容的方法
Jul 30 #Python
python查看FTP是否能连接成功的方法
Jul 30 #Python
python如何实现excel数据添加到mongodb
Jul 30 #Python
python学习之第三方包安装方法(两种方法)
Jul 30 #Python
You might like
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP文件操作详解
2016/12/30 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
javascript几个易错点记录
2014/11/26 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
Python全局变量操作详解
2015/04/14 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
机械设计及其自动化求职推荐信
2014/02/17 职场文书
安全教育实施方案
2014/03/02 职场文书
车辆转让协议书
2014/04/15 职场文书
中学生操行评语大全
2014/04/24 职场文书
大班亲子运动会方案
2014/06/10 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
总经理岗位职责范本
2015/04/01 职场文书
2016党员三严三实心得体会
2016/01/15 职场文书