废话不多说,只要看一个例子就明白了。
// 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; }