将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 05 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
Python中用psycopg2模块操作PostgreSQL方法
Nov 28 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 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 项目的方法
2007/01/02 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
几道PHP的面试题
2012/05/19 面试题
如何进行Linux分区优化
2013/02/12 面试题
英语老师推荐信
2014/02/26 职场文书
大学生社会实践自我鉴定
2014/03/24 职场文书
承诺书怎么写
2014/03/26 职场文书
初中运动会前导词
2015/07/20 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
高中团支书竞选稿
2015/11/21 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
Golang: 内建容器的用法
2021/05/05 Golang
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python