将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的迭代器和生成器使用实例
Jan 14 Python
学习python类方法与对象方法
Mar 15 Python
Python日期时间对象转换为字符串的实例
Jun 22 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
详解Python中is和==的区别
Mar 21 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
Aug 07 Python
wxPython实现列表增删改查功能
Nov 19 Python
python 实现人和电脑猜拳的示例代码
Mar 02 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
python使用openpyxl操作excel的方法步骤
May 28 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
python 动态绘制爱心的示例
Sep 27 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
火车头采集器3.0采集图文教程
2007/03/17 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
php构造函数实例讲解
2013/11/13 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
date.parse在IE和FF中的区别
2010/07/29 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
javascript判断office版本示例
2014/04/11 Javascript
js文字横向滚动特效
2015/11/11 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
关于微信小程序登录的那些事
2019/01/08 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
python opencv实现运动检测
2018/07/10 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
正隆泰信息技术有限公司上机题
2012/06/14 面试题
质检员的岗位职责
2013/11/15 职场文书
会计应届生的自荐信
2013/12/13 职场文书
商场中秋节广播稿
2014/01/17 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
Vue全局事件总线你了解吗
2022/02/24 Vue.js
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS