c++中使用python

C++中调用Python脚本的意义就是热加载,可以把它当成脚本形式的动态链接库,只要提供的函数接口是一致的。c++也有动态库,那么python的作用也就是不需要每次手动编译该文件,易于维护,不会当机。甚至可以让策划人员自己编辑python脚本(跟lua类似,现在比较多的是lua嵌入c++使用)。

先看Python的代码 
代码:
#test function 
def add(a,b): 
    print "in python function add" 
    print "a = " + str(a) 
    print "b = " + str(b) 
    print "ret = " + str(a+b) 
    return 

def foo(a): 
    print "in python function foo" 
    print "a = " + str(a) 
    print "ret = " + str(a * a) 
    return 

把上面的Python代码存到文件pymathlib.py,这样pymathlib.py就是一个脚本形式的动态库了。 
接下来是c++ 的代码 
#include "Python.h" 
int main(int argc, char** argv) 
{ 
    // 初始化Python 
    //在使用Python系统前,必须使用Py_Initialize对其 
    //进行初始化。它会载入Python的内建模块并添加系统路 
    //径到模块搜索路径中。这个函数没有返回值,检查系统 
    //是否初始化成功需要使用Py_IsInitialized。 
    Py_Initialize(); 
    // 检查初始化是否成功 
    if ( !Py_IsInitialized() ) 
    { 
        return -1; 
    } 
    // 添加当前路径 
    //把输入的字符串作为Python代码直接运行,返回0 
    //表示成功,-1表示有错。大多时候错误都是因为字符串 
    //中有语法错误。 
    PyRun_SimpleString("import sys"); 
    PyRun_SimpleString("sys.path.append('./')"); 
    PyObject *pName,*pModule,*pDict,*pFunc,*pArgs; 

    // 载入名为pytest的脚本 
    pName = PyString_FromString("pymathlib"); 
    pModule = PyImport_Import(pName); 
    if ( !pModule ) 
    { 
        printf("can't find pymathlib.py"); 
        getchar(); 
        return -1; 
    } 
    pDict = PyModule_GetDict(pModule); //全局函数、变量在字典中
    if ( !pDict ) 
    { 
        return -1; 
    } 

    // 找出函数名为add的函数 
    pFunc = PyDict_GetItemString(pDict, "add"); 
    if ( !pFunc || !PyCallable_Check(pFunc) ) 
    { 
        printf("can't find function [add]"); 
        getchar(); 
        return -1; 
    } 

    // 参数进栈 
    *pArgs; 
    pArgs = PyTuple_New(2); 
    //  PyObject* Py_BuildValue(char *format, ...) 
    //  把C++的变量转换成一个Python对象。当需要从 
    //  C++传递变量到Python时,就会使用这个函数。此函数 
    //  有点类似C的printf,但格式不同。常用的格式有 
    //  s 表示字符串, 
    //  i 表示整型变量, 
    //  f 表示浮点数, 
    //  O 表示一个Python对象。 
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i",3)); //压入参数到栈的第3个位置(第一个位置是函数本身,会自动清栈,有返回结果则会再压入栈中)
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i",4)); //压入参数到栈的第4个位置
    // 调用Python函数 
    PyObject_CallObject(pFunc, pArgs); 
    //下面这段是查找函数foo 并执行foo 
    pFunc = PyDict_GetItemString(pDict, "foo"); 
    if ( !pFunc || !PyCallable_Check(pFunc) ) 
    { 
        printf("can't find function [foo]"); 
        getchar(); 
        return -1; 
    } 

    pArgs = PyTuple_New(1); 
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i",2)); // 

    PyObject_CallObject(pFunc, pArgs); 

    Py_DECREF(pName); 
    Py_DECREF(pArgs); 
    Py_DECREF(pModule); 

    // 关闭Python 
    Py_Finalize(); 
    return 0; 
} 

需要指定头文件路径和连接静态库python2.7lib
代码:
g++ PythonTest.cpp -I/usr/local/include/python2.7 -L/usr/local/lib/python2.7 -lpython2.7  
 

你可能感兴趣的:(c++中使用python)