将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中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
python计算圆周率pi的方法
Jul 11 Python
将Python的Django框架与认证系统整合的方法
Jul 24 Python
Python list操作用法总结
Nov 10 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
python中退出多层循环的方法
Nov 27 Python
python中嵌套函数的实操步骤
Feb 27 Python
python面向对象 反射原理解析
Aug 12 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
Python接口自动化测试的实现
Aug 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在window iis的莫名问题的测试方法
2013/05/14 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
使用js实现一个简单的滚动条过程解析
2019/09/10 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
python33 urllib2使用方法细节讲解
2013/12/03 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python的Django框架中的数据过滤功能
2015/07/17 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
青年安全生产示范岗事迹材料
2014/05/04 职场文书
校运动会广播稿300字
2014/10/07 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
毕业设计论文评语
2014/12/31 职场文书
消防演习通知
2015/04/25 职场文书