使用 boost-python 执行 python 函数(不是全局范围语句)

Execute python function with boost-python (not global scope statements)

我有一个关于 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] 在Python").

中定义问候函数

例如,如果我像这样在 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() 函数。我怎样才能做到这一点?

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

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

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

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

if __name__ == "__main__":

示例:

*script.py*

def local():
    print "local"

if __name__ == "__main__":
    print "global"

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