【问题标题】:Execute python function with boost-python (not global scope statements)使用 boost-python 执行 python 函数(不是全局范围语句)
【发布时间】:2015-07-20 21:52:55
【问题描述】:

我有一个关于 boost-python 的问题。基本上我想执行一个特定的 python 函数,该函数存储在带有 boost-python 的 std::string 中。文档中有一个如何实现此目的的示例:Boost python doc

所以我正在做的是(C++ 代码):

using namespace boost::python;
Py_Initialize();

// Retrieve the main module.
object main = import("__main__");

// Retrieve the main module's namespace
object global(main.attr("__dict__"));

// Define greet function in Python.
object result = exec(string_with_python_code.c_str(), global, global);

object greet = global["greet"];

//calling greet() function
greet();

Py_Finalize();

但是,这也会执行不在函数中而是在全局范围内的代码(与文档中 exec() 语句上方的语句相反:“[only] Define Python 中的 greet 函数”)。

例如,如果我像这样在 string_with_python_code 中设置 python 代码:

string_with_python_code = "print 'Hello global world!'    \n"
                          "                               \n"
                          "def greet():                   \n"
                          "    print 'Hello local world!' \n"
                          "    return                     \n";

然后是句子“Hello global world!”也被打印出来(在“Hello local world!”被打印出来之前)。

但是,我希望完成的是只有函数 greet() 被执行。我怎样才能做到这一点?

【问题讨论】:

    标签: c++ boost-python


    【解决方案1】:

    Python 函数定义是 Python 代码的执行。 Python 模块导入也是如此:导入模块会导致任意 Python 语句运行。

    不运行函数定义之外的代码的方法是不将函数定义之外的代码传递给execexec 将完全按照您的要求去做,不会少。

    【讨论】:

      【解决方案2】:

      如果您使用解释器或 Python C API / BOOST Python 导入 python 模块,则全局范围内的所有内容都将被执行。 这就是python的工作原理。

      要解决此问题,请在全局范围之前添加:

      if __name__ == "__main__":
      

      例子:

      *script.py*
      
      def local():
          print "local"
      
      if __name__ == "__main__":
          print "global"
      

      如果您执行脚本,则只会打印“全局”。如果您导入此模块,则不会打印任何内容。

      【讨论】:

        猜你喜欢
        • 2016-05-06
        • 2021-10-14
        • 2021-06-13
        • 2017-06-27
        • 2019-01-08
        • 1970-01-01
        • 2017-04-26
        • 2012-12-02
        相关资源
        最近更新 更多