Boost Python中exec,eval, exec_file, extract的函数形式和使用方法

exec函数

函数的signature:

boost::pythoin::api::object exec(boost::python::str string,
            boost::python::api::object global=boost::python::api::object(),
            boost::python::api::object local=boost::python::api::object())

示例:

//C++
boost::python::object main_module = import("__main__");
boost::python::object main_namespace = main_module.attr("__dict__");
boost::python::object return_value = exec("result = 2**10", main_namespace,main_namespace);

函数作用:用来执行一个字符串形式语句,或者表达式,并返回得到的计算结果。
参数:

  • string:需要执行的语句或表达式字符串,如result=2**10 #2^10
  • global:需要执行的字符串是放在哪个全局作用域中。
  • local:需要执行的字符串是放在哪个局部作用域中。

返回的值是Boost::Python::api中的Object对象。
可以使用extract来获得C++类型的值。

eval函数

函数的signature:

namespace bpa = boost::python::api;
bpa::object bpa::eval(boost::python::str string, 
    bpa::object global=bpa::object(), bpa::object local = bpa::object())

示例:

//C++
boost::python::object main_module = import("__main__");
boost::python::object main_namespace = main_module.attr("__dict__");
boost::python::object return_value = eval("2**10", main_namespace,main_namespace);

函数作用:用来执行一个python求值的表达式的字符串, 并返回得到的计算结果。
参数:

  • string:需要执行的表达式字符串,如2**10 #2^10
  • global:需要执行的字符串是放在哪个全局作用域中。
  • local:需要执行的字符串是放在哪个局部作用域中。

返回的值是Boost::Python::api中的Object对象。
eval与exec的调用形式相同,作用也基本相同,区别是

eval :evaluate Python expression from str
用来直接运行一个表达式求得一个值,而不是运行一个语句,eval需要有返回的值。
exec:execute python expression from str
用来运行一个表达式或者运行一个语句,可以有返回值,也可以没有。

using namespace boost::python::api;
object result = eval("result=2*10",main_namespace,main_namespace);
//Error: 无法执行,因为需要得到一个返回结果,而非运行一个语句
object result1 = eval("2*10",main_namespace, main_namespace);
//correct.

object result2 = eval("result=2*10",main_namespace,main_namespace);
//correct:无论语句还是表达式,都可以执行。
object result3 = eval("2*10",main_namespace, main_namespace);
//correct.

exec_file函数

函数的signature:

namespace bpa=boost::python::api;
bpa::object exec_file(boost::python::str filename, 
    bpa::object global=bpa::object(), bpa::object local=pba::object())

示例:

//C++
boost::python::object main_module = import("__main__");
boost::python::object main_namespace = main_module.attr("__dict__");
boost::python::object simple = exec_file("D:\\demoPython\\example.py", main_namespace,main_namespace);

函数作用:Execute python source code from file ‘filename’.
参数:

  • filename:需要执行的路径和文件名。
  • global:需要执行的字符串是放在哪个全局作用域中。
  • local:需要执行的字符串是放在哪个局部作用域中。

主要用来将文件加载到namespace中,用来后期调用其中的一些函数。

extract<>函数

函数的signature:

boost::python::extract(boost::python::api::object const& o)
boost::python:;extract<T>(PyObject* o)
boost::python::extract(const boost::python::extract& o)

示例:

// C++
using namespace boost::python;
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
object add_func = mainNamespace["add"];

// extract(object const& o)
double add_result = extract(add_func(12));
// Pythonscript: def add(a): return a+100

// boost::python:;extract(PyObject* o)
object obj_result = extract(add_func(12));
double double_result = extract(obj_result.ptr());//object.ptr() to get PyObject pointer.

list input_list; // list: 'a', 'b','c','e','f'
input_list.append('a');
input_list.append('b');
input_list.append('c');
input_list.append('e');
input_list.append('f');
// boost::python::extract(const boost::python::extract& o)
auto extract_result = extract(extract(dosomething(input_list)));
//extract_result: 'a', 'b','c','e','f' 
  

                            
                        
                    
                    
                    

你可能感兴趣的:(python,C++,boost-python,Boost)