将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里大整数相乘相关技巧指南
Sep 12 Python
Python中几种导入模块的方式总结
Apr 27 Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
创建Shapefile文件并写入数据的例子
Nov 26 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 Python
使用openCV去除文字中乱入的线条实例
Jun 02 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 Python
详解python的内存分配机制
May 10 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 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高效率写法(详解原因)
2013/06/20 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
python计算书页码的统计数字问题实例
2014/09/26 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python批量解压zip文件的方法
2019/08/20 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
使用Pycharm分段执行代码
2020/04/15 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
巴西购物网站:Submarino
2020/01/19 全球购物
《春雨》教学反思
2014/04/24 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
同志主要表现材料
2014/08/21 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
健康状况证明书
2014/11/26 职场文书
考试作弊检讨书
2015/01/27 职场文书
前台接待员岗位职责
2015/04/15 职场文书
初中毕业生感言
2015/07/31 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书