廢話不多說,只要看一個例子就明白了。
// 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;}