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

13 篇文章 0 订阅
3 篇文章 0 订阅

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<T>(boost::python::api::object const& o)
boost::python:;extract<T>(PyObject* o)
boost::python::extract<T>(const boost::python::extract<T>& o)

示例:

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

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

// boost::python:;extract<T>(PyObject* o)
object obj_result = extract<object>(add_func(12));
double double_result = extract<double>(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<T>(const boost::python::extract<T>& o)
auto extract_result = extract<list>(extract<list>(dosomething(input_list)));
//extract_result: 'a', 'b','c','e','f'
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值