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中