你如何从__future__进口部门"在boost :: python中?

时间:2017-07-11 23:22:01

标签: python c++ boost boost-python

我在Python 2.7中使用boost :: python。我希望启用Python 3.0样式的除法来调用boost :: python :: eval,就像使用

的Python程序一样
from __future__ import division

这看起来应该有用,虽然它会引入所有 future ,而不仅仅是分割方法:

boost::python::object mainModule = boost::python::import( "__main__" );
boost::python::object mainNamespace = mainModule.attr( "__dict__" );
mainNamespace[ "__future__" ] = boost::python::import( "__future__" );

return boost::python::eval(
  myExpression,
  mainNamespace,
  mainNamespace );

不幸的是,表达式仍然使用Python 2.x样式分区进行评估。

  1. 在boost :: Python中启用 future 的正确方法是什么?

  2. 如何使用boost :: python导入单个方法而不是整个库?

1 个答案:

答案 0 :(得分:1)

  1. 似乎最好的方法是使用从您想要的 future 导入功能的脚本来初始化解释器。

  2. 您可以使用exec和import语句导入模块的子集。由于未来如何工作,为exec语句编译的代码提供指令,您不能简单地导入exec然后执行评估。

  3. 文件说明:

      

    在交互式解释器提示符下键入的未来语句将对解释器会话的其余部分生效。如果使用-i选项启动解释器,则传递脚本名称以执行,并且脚本包含future语句,它将在脚本执行后启动的交互式会话中生效。

    可以通过执行具有所需未来导入的脚本来初始化Python C API中的解释器以使用future。我无法让这个工作。但我可能错误地使用了API。

    另一种选择,如下所示:

    boost::python::object main_module = boost::python::import("__main__");
    boost::python::object main_namespace = main_module.attr("__dict__");
    std::string evalString = "3/2";
    std::stringstream evalStringFunction;
    evalStringFunction << "from __future__ import division\n";
    evalStringFunction << "def evalWithFuture(): return " << evalString;
    boost::python::exec(evalStringFunction.str().c_str(), main_namespace,
                      main_namespace);
    boost::python::object result =  boost::python::eval("evalWithFuture()", main_namespace, main_namespace);
    

    这里的想法是函数evalWithFuture将在未来导入时编译。因为它是一个表达式,所以您可以在评估调用中使用它,它将使用适当的未来除法运算符。