将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 02 Python
python 列表降维的实例讲解
Jun 28 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
Python3 集合set入门基础
Feb 10 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
Python在字符串中处理html和xml的方法
Jul 31 Python
Python将QQ聊天记录生成词云的示例代码
Feb 10 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 Python
你需要掌握的20个Python常用技巧
Feb 28 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将会员数据导入到ucenter的代码
2010/07/18 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
JS 控制CSS样式表
2009/08/20 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
Python中的rfind()方法使用详解
2015/05/19 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
python中有帮助函数吗
2020/06/19 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
某公司面试题
2012/03/05 面试题
实习鉴定评语
2014/01/19 职场文书
办理收楼委托书范本
2014/10/09 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书