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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值