将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之通过Python连接数据库
Oct 28 Python
python算法表示概念扫盲教程
Apr 13 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
Python一键安装全部依赖包的方法
Aug 12 Python
python 利用pyttsx3文字转语音过程详解
Sep 25 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
Oct 27 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
PHP 面向对象实现代码
2009/11/11 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
2015/04/12 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
迟到检讨书400字
2014/01/13 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
关于环保的标语
2014/06/13 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android
教你如何用cmd快速登录服务器
2022/06/10 Servers
MySQL事务的隔离级别详情
2022/07/15 MySQL