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