C++调用Python

本文介绍了如何在C++程序中嵌入Python,以利用Python的灵活性。首先,讨论了Python嵌入的原理和两种使用方式。接着,详细讲解了Python C API的基础,包括如何执行Python代码、数据类型转换、访问Python函数和类。通过示例代码展示了如何创建C++程序来调用Python解释器执行Python语句、函数和类的方法。
摘要由CSDN通过智能技术生成

1、Python嵌入程序介绍

为什么要使用Python嵌入程序

Python作为一门流行通用的脚本语言,可以很好的和C/C++程序结合在一起。 在一个C/C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件,这样可以很方便地更具需要求的变化改写脚本代码(进行不同的数据处理),而不是必须重新编译链接二进制的动态链接库。

Python嵌入的原理

在一个C/C++程序中使用Python程序有两种方式:
1. 使用使用一个可变的Python字符串,通过Python引擎执行
2. 构造一个Python模块,根据类,方法,构造参数来调用

除了这些使用方式上的不同,基本的执行调度如下所示:
1. 初始化Python解释器的实例
2. 执行Python代码
3. 释放Python解释器

2、Python C API基础

Python C API介绍

Python C API基本方法如下所示(第一列对应C API的使用,第二列对应Python中的使用):

C API Python 描述
PyImport_ImportModule import module
PyImport_ReloadModule reload(module)
PyImport_GetModuleDict sys.modules
PyModule_GetDict module.__dict__
PyDict_GetItemString dict[key]
PyDict_SetItemString dict[key] = value
PyDict_New dict = {}
PyObject_GetAttrString getattr(obj, attr)
PyObject_SetAttrString setattr(obj, attr, val)
PyEval_CallObject apply(function, args) 调用函数,其中args是元组
PyRunString eval(expr), exec expr expr被当作python语句执行
PyRun_File execfile(filename) 执行文件
PySetProgramName sys.argv[0]
PyGetProgramName sys.argv[0]
PySys_SetArgv sys.argv

exec语句用来执行保存在字符串或是文件中的Python语句,例如:

>>> exec 'print "Hello World"'

eval语句用来计算保存在字符串中的有效Python表达式,例如:

>>> eval_r('2*3')

两者的区别就是,eval把字符串当成有效的Python表达式来求值,并返回计算结果。
execfile用来执行一个文件,例如:

>>> execfile(r'd:\code\ex\test.py')

创建一个C++调用Python解释器执行python语句的程序

helloworld.cpp:

#include "python2.6/Python.h"
int main() {
  Py_Initialize();

  const char * cstr_cmd = "sys.path.append('./')";
  PyRun_SimpleString("import sys");
  PyRun_SimpleString(cstr_cmd);

  PyRun_SimpleString("import helloworld");
  PyRun_SimpleString("helloworld.test()");
  Py_Finalize();
  return 0;
}

helloworld.py

#!/usr/bin/python
# encoding: utf-8

def test():
    print "helloworld"

3、数据类型转换

在C/C++程序中可使用printf以及scanf函数作为输入和输出,而在Python C API中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值