boost.python庫應用之嵌入python

來源:互聯網
上載者:User

    廢話不多說,只要看一個例子就明白了。

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


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.