• C++中调用Python脚本


    下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

    编程之家小编现在分享给大家,也给大家做个参考。

    C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,

    需要的时候还可以改一改,只要不改变接口, 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代码存为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 -1;
    }
     
    // 添加当前路径
    //把输入的字符串作为Python代码直接运行,返回0
    //表示成功,-1表示有错。大多时候错误都是因为字符串
    //中有语法错误。
    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 -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 = PyTuple_New(2);
     
    // PyObject* Py_BuildValue(char *format,...)
    // 把C++的变量转换成一个Python对象。当需要从
    // C++传递变量到Python时,就会使用这个函数。此函数
    // 有点类似C的printf,但格式不同。常用的格式有
    // s 表示字符串,
    // i 表示整型变量,
    // f 表示浮点数,
    // O 表示一个Python对象。
     
    PyTuple_SetItem(pArgs,Py_BuildValue("l",3));
    PyTuple_SetItem(pArgs,1,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,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

    如果你的Python 版本号与我的不同,请修改为你自己的版本号.
    _________________________________________________________________________________________________________________________________________________
    每一个不曾起舞的日子,都是对生命的辜负。
    But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
    其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采
  • 相关阅读:
    Java实现旅行商问题
    Java实现旅行商问题
    Java实现旅行商问题
    Java实现旅行商问题
    递归执行顺序的探究
    递归执行顺序的探究
    递归执行顺序的探究
    配置我的Ubuntu Server记(包括桌面及VNC,SSH,NTP,NFS服务) good
    罗辑思维 137 藩镇割据:毒药还是良药?(要懂得自我收敛?不要什么事情都自己做?)
    云计算CTO工作的具体内容(挺详细)
  • 原文地址:https://www.cnblogs.com/leoking01/p/14591228.html
Copyright © 2020-2023  润新知