dfdh 发表于 2015-12-2 10:31:21

C++中嵌入Python

  c++调用python的流程如下:


1:includt<boost/python.cpp>      ;注意不用导入<python.h>文件

2:初始化python解释器: Py_Initialize()

3 :调用别的Python/C API做一些环境的初始化操作。比如把python的全局锁,到脚本加入到解释器的include路径下。




[*]


PyRun_SimpleString("import sys");
PyRun_SimpleString((std::string("if not '")+ m_scriptPath
+"' in sys.path: sys.path.append('"+ m_scriptPath +"')").c_str());


Boost.python提供了3中运行python代码的方法;






object eval(str expression, object globals = object(), object locals = object())
object exec(str code, object globals = object(), object locals = object())
object exec_file(str filename, object globals = object(), object locals = object())

eval 执行表达式,exec执行语句,exec_file执行文件。 globals和locals变量是dict对象包含了代码运行的全局和本地环境


[*]


object main_module =import("__main__");
object main_namespace = main_module.attr("__dict__");
object ignored = exec("result = 5 ** 2", main_namespace);
int five_squared = extract<int>(main_namespace["result"]);


4:导入module:

python::import(std::string name)相当python的import语句



6: tuple的用法

object



7:dict的用法

dict["name"]



8:str的用法




[*]


object main_module =import("__main__");
object main_namespace = main_module.attr("__dict__");
object ignored = exec("result = (3,4,6)", main_namespace);
string str=python::extract<string>(python::str(main_namespace["result"]).encode("utf-8"));
cout<<"result"<<str<<endl;




异常处理




[*]


catch(...)
{
PyErr_Print();
PyErr_Clear();
PD_RC_CHECK( DBAAS_SYS_ERR, PDERROR,
"Failed to delete vm, python error detected!");
}


其实object还有很多方法,同时python的buildin函数在boost.python也有对象的方法 比如len



下面是一个对象调用的例子:




[*]


try
{
PythonExecThrLock _pyLock ;
PyRun_SimpleString("import sys");
PyRun_SimpleString((std::string("if not '")+ m_scriptPath
+"' in sys.path: sys.path.append('"+ m_scriptPath +"')").c_str());
python::object module = python::import("ModuleName");
python::object global( module.attr("__dict__"));
m_instService = global["ClassName"];
python::object instService=m_instService();//调用构造函数,如果构造函数有参数,请传入。
python::object createInstance=instService.attr("createInstance");//获取对象的方法
ret = createInstance(int类型,std::string类型);//调用方法,返回一个object对象,如果要获取返回值需要对ret解析。使用extract
std::string strRet=python::extract<std::string>(str(result).encode("utf-8"))
}
catch(...)
{
PythonExecThrLock _pyLock ;
PyErr_Print();
PyErr_Clear();
PD_RC_CHECK( DBAAS_SYS_ERR, PDERROR,
"Failed to init aliCloudVmProvider, python error detected!");
}
  

  
页: [1]
查看完整版本: C++中嵌入Python