将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 相关文章推荐
python3解析库pyquery的深入讲解
Jun 26 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
Django如何将URL映射到视图
Jul 29 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
js读取配置文件自写
2014/02/11 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
python中MySQLdb模块用法实例
2014/11/10 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
python实现清屏的方法
2015/04/30 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
windows下python和pip安装教程
2018/05/25 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
如何通过python检查文件是否被占用
2020/12/18 Python
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
C语言中break与continue的区别
2012/07/12 面试题
团支书的期末学习总结自我评价
2013/11/01 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
成人继续教育实施方案
2014/03/01 职场文书
明星邀请函
2015/02/02 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android