将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的Twisted框架实现一个简单的服务器
Apr 16 Python
Python中List.index()方法的使用教程
May 20 Python
pycharm远程调试openstack代码
Nov 21 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
python一键去抖音视频水印工具
Sep 14 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 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
日本十大惊悚动漫
2020/03/04 日漫
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
javascript知识点收藏
2007/02/22 Javascript
javascript cookies操作集合
2010/04/12 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
js Calender控件使用详解
2015/01/05 Javascript
再谈JavaScript线程
2015/07/10 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
Python strip lstrip rstrip使用方法
2008/09/06 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
python算的上脚本语言吗
2020/06/22 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
幼儿园教学管理制度
2014/02/04 职场文书
新春文艺演出主持词
2014/03/27 职场文书
校园文明倡议书
2014/05/16 职场文书
经费申请报告范文
2015/05/18 职场文书
圆明园观后感
2015/06/03 职场文书
学校运动会通讯稿
2015/07/18 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
golang正则之命名分组方式
2021/04/25 Golang