程序员人生 网站导航

C/C++中如何调用Python

栏目:互联网时间:2015-06-29 08:22:36
C++中调用Python脚本的意义就不讲了,最少你可以把它当做文本情势的动态链接库, 

需要的时候还可以改1改,只要不改变接口, C++的程序1旦编译好了,再改就没那末方便了 

先看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代码存为pytest.py 

接下来是c++ 的代码 
代码:

#include "Python.h" 

int main(int argc, char** argv) 

    // 初始化Python 
    //在使用Python系统前,必须使用Py_Initialize对其 
    //进行初始化。它会载入Python的内建模块并添加系统路 
    //径到模块搜索路径中。这个函数没有返回值,检查系统 
    //是不是初始化成功需要使用Py_IsInitialized。 

    Py_Initialize(); 

    // 检查初始化是不是成功 
    if ( !Py_IsInitialized() ) 
    { 
        return ⑴; 
    } 

    // 添加当前路径 
    //把输入的字符串作为Python代码直接运行,返回0 
    //表示成功,⑴表示有错。大多时候毛病都是由于字符串 
    //中有语法毛病。 
    PyRun_SimpleString("import sys"); 
    PyRun_SimpleString("sys.path.append('./')"); 
    PyObject *pName,*pModule,*pDict,*pFunc,*pArgs; 

    // 载入名为pytest的脚本 
    pName = PyString_FromString("pytest"); 
    pModule = PyImport_Import(pName); 
    if ( !pModule ) 
    { 
        printf("can't find pytest.py"); 
        getchar(); 
        return ⑴; 
    } 
    pDict = PyModule_GetDict(pModule); 
    if ( !pDict ) 
    { 
        return ⑴; 
    } 

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

    // 参数进栈 
    *pArgs; 
    pArgs = PyTuple_New(2); 

    //  PyObject* Py_BuildValue(char *format, ...) 
    //  把C++的变量转换成1个Python对象。当需要从 
    //  C++传递变量到Python时,就会使用这个函数。此函数 
    //  有点类似C的printf,但格式不同。经常使用的格式有 
    //  s 表示字符串, 
    //  i 表示整型变量, 
    //  f 表示浮点数, 
    //  O 表示1个Python对象。 

    PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3)); 
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",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 ⑴; 
    } 

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

    PyObject_CallObject(pFunc, pArgs); 


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

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



编译选项, 需要手动指定Python 的include 路径, 和链接接路径, 


g++ Python.cpp -o Python -I/usr/include/python2.5 -L/usr/lib/python2.5 -lpython2.5 

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐