将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 相关文章推荐
python的迭代器与生成器实例详解
Jul 16 Python
python简单判断序列是否为空的方法
Jun 30 Python
详解Python3中yield生成器的用法
Aug 20 Python
django写用户登录判定并跳转制定页面的实例
Aug 21 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
python3 实现口罩抽签的功能
Mar 11 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
django和flask哪个值得研究学习
Jul 31 Python
Python使用xpath实现图片爬取
Sep 16 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 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 操作符与控制结构
2012/03/07 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
python基础教程之基本内置数据类型介绍
2014/02/20 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
django框架创建应用操作示例
2019/09/26 Python
Python日志syslog使用原理详解
2020/02/18 Python
python中adb有什么功能
2020/06/07 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
介绍Java的内部类
2012/10/27 面试题
升学宴主持词
2014/04/02 职场文书
水电站项目建议书
2014/05/12 职场文书
关于保护环境的建议书
2014/08/26 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
护士个人年终总结
2015/02/13 职场文书
教师党员自我评价2015
2015/03/04 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
优秀教师工作总结2015
2015/07/22 职场文书