代码之家  ›  专栏  ›  技术社区  ›  Mike

如何在boost::python中“从未来导入分区”呢?

  •  1
  • Mike  · 技术社区  · 7 年前

    from __future__ import division
    

    这看起来应该会起作用,尽管它会吸引所有人 将来 ,而不仅仅是除法:

    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. 启用的正确方法是什么 将来

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   ukhat    7 年前
    1. 似乎最好的方法是使用从中导入功能的脚本初始化解释器 将来

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

    在交互式口译员提示下键入的未来声明将在口译员会话的其余时间生效。如果解释器是用-i选项启动的,并被传递一个要执行的脚本名,并且该脚本包含一个future语句,那么它将在执行脚本后启动的交互会话中生效。

    另一种选择如下:

    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);