将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中使用SQLite的简单教程
Apr 29 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
如何高效使用Python字典的方法详解
Aug 31 Python
简单实现python进度条脚本
Dec 18 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 Python
python使用正则来处理各种匹配问题
Dec 22 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
Python读取yaml文件的详细教程
Jul 21 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
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
用JS在浏览器中创建下载文件
2014/03/05 Javascript
Jquery性能优化详解
2014/05/15 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
jQuery事件对象总结
2016/10/17 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
详解Python进程间通信之命名管道
2017/08/28 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
2019/09/20 Python
蔻驰美国官网:COACH美国
2016/08/18 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
党员干部承诺书范文
2014/03/25 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
建设工地安全标语
2014/06/07 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
励志演讲稿300字
2014/08/21 职场文书
合作协议书范本
2014/10/25 职场文书
教师个人发展总结
2015/02/11 职场文书
售后服务质量承诺书
2015/04/29 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android