将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 uuid模块使用实例
Apr 08 Python
matplotlib简介,安装和简单实例代码
Dec 26 Python
Python实现屏幕截图的两种方式
Feb 05 Python
Anaconda入门使用总结
Apr 05 Python
python实现最长公共子序列
May 22 Python
python实现机器学习之元线性回归
Sep 06 Python
Python实现使用request模块下载图片demo示例
May 24 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
如何基于Python + requests实现发送HTTP请求
Jan 13 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
python3.7添加dlib模块的方法
Jul 01 Python
python 实现两个变量值进行交换的n种操作
Jun 02 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
jquery遍历input取得input的name
2009/04/27 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
js读取本地excel文档数据的代码
2010/11/11 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
深入理解Python中的*重复运算符
2017/10/28 Python
python实现简易版计算器
2020/06/22 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
python视频按帧截取图片工具
2019/07/23 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
毕业生自荐书
2014/02/03 职场文书
学校党员对照检查材料
2014/08/28 职场文书
调研报告的主要写法
2019/04/18 职场文书
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers