zoukankan      html  css  js  c++  java
  • boost.python库应用之嵌入python

        废话不多说,只要看一个例子就明白了。

    // testPython.cpp : 定义控制台应用程序的入口点。
    
    #include <iostream>
    using namespace std;
    
    #include <Python.h>
    #include <boost/python.hpp>
    using namespace boost::python;//使用boost::python命名空间
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Py_Initialize ();//初始化python环境
        if(!Py_IsInitialized())
        {
            cout<<"------python初始化失败"<<endl;
            return 0;
        }
    
        object mainModule;//main模块
        object mainNamespace;//main命名空间
        try
        {
            mainModule = import("__main__");//导入__main__模块
            mainNamespace = mainModule.attr("__dict__");
    
            //直接执行
            exec("import os", mainNamespace, mainNamespace);
            exec("print os.getcwd()", mainNamespace, mainNamespace);
    
            //间接执行
            object mod = mainModule.attr("os");
            object foo = mod.attr("getcwd");
            string dir = extract<string>(foo());
            cout<<"cur dir:"<<dir<<endl;
    
            mod = mod.attr("path");
            foo = mod.attr("isfile");
            bool r = extract<bool>(foo("testPython.cpp"));
            cout<<"file exsit:"<<r<<endl;
        }
        catch(...)
        {
            if (PyErr_Occurred())
                PyErr_Print();
        }
    
        //Py_Finalize (); //不要调用Py_Finalize,因为boost库目前还不完善,有全局变量还未释放。
        system("pause");
        return 0;
    }
    

    简要说明下:

    import:导入模块。

    object :相当于PyObject,是对PyObject类型的封装。可以理解为万能的Python类型。

    object::attr(char const*):获得模块的属性。

    foo():相当于函数调用,返回值是一个object类型。

    extract:将object类型转换成相应的C++类型。


        嵌入python,基本上就这些东西了。

       下面是个更全面点的例子:

    // testPython.cpp : 定义控制台应用程序的入口点。
    
    #include <iostream>
    using namespace std;
    
    #include <Python.h>
    #include <boost/python.hpp>
    using namespace boost::python;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Py_Initialize ();
        if(!Py_IsInitialized())
        {
            cout<<"------python初始化失败"<<endl;
            return 0;
        }
    
        try
        {
            object mainModule = import("__main__"); //main模块
            object mainNamespace = mainModule.attr("__dict__");//main命名空间
    
            //e1.直接执行方法。获取当前路径。
    
            //在匿名空间中运行,即结果会保留在mainNamespace中,
            //可以以mainNamespace["xx"]的方式取得结果。
            exec("import os", mainNamespace, mainNamespace); //导入os 模块
            exec("path = os.getcwd()", mainNamespace, mainNamespace); //获得当前路径
            exec("print 'cur path is :', path", mainNamespace, mainNamespace); //打印当前路径
            
            //e2.从命名空间中取出path变量
    
            object path = mainNamespace["path"];    //取得变量path。
            string pathname = extract<string>(path); //转换成c++ string类型。
            cout<<"cur path is : "<< pathname << endl;
    
            //注意:只有字典类型、表列、列表,才可以使用[]运算符,取得元素。
            //其余类型,这样使用会抛出异常。
    
            //e3.间接执行方法。获取当前路径。
    
            //以下3种方法均可以取得os模块。
            //object os = import("os");             //直接导入
            //object os = mainModule.attr("os");    //从main模块获得属性os模块
            object os = mainNamespace["os"];        //从字典中取出元素os模块
            object getcwd = os.attr("getcwd");      //获得getcwd方法
            object result = getcwd();               //执行getcwd方法
            string dir = extract<string>(result);   //转换结果为c++类型
            cout<<"cur path is : "<<dir<<endl;
    
            //e4.判断文件是否存在
            object isfile = os.attr("path").attr("isfile");
            bool r = extract<bool>(isfile("testPython.cpp"));
            cout<<"file testPython.cpp exsit? "<<r<<endl;
    
            //e5.操作list。
            object sys = import("sys");         //导入sys模块
            object paths = sys.attr("path");    //取出path属性
            string path0 = extract<string>(paths[0]);//获得path的第一个元素
            cout<<"sys path0 : "<<path0<<endl;
    
            //e6.使用contains,判断序列中是否含有元素。
            bool haskey = bool(mainNamespace.contains("os"));//判断a是否在
            cout<<"mainNamespace haskey 'os' : "<<haskey<<endl;
    
            bool hasvalue = bool(paths.contains(5));
            cout<<"paths has a value '5' : "<<hasvalue<<endl;
        }
        catch(...)
        {
            if (PyErr_Occurred())
                PyErr_Print();
        }
    
        //Py_Finalize (); //不要调用Py_Finalize,因为boost库目前还不完善,有全局变量还未释放。
        system("pause");
        return 0;
    }
    



  • 相关阅读:
    循环神经网络(LSTM和GRU)(1)
    threading包的例子和queue包的例子
    xgboost调参
    理解 Python 中的 *args 和 **kwargs
    TFRecords文件的生成和读取(1)
    tensorflow函数介绍(4)
    python其他篇(1)
    python实现Restful服务(基于flask)(2)
    开源多线程性能测试工具-sysbench
    MySQL 8.0.0 版本发布,亮点都在这了!
  • 原文地址:https://www.cnblogs.com/ygxsk/p/7694003.html
Copyright © 2011-2022 走看看