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

时间:2015-07-20 21:52:55

标签: c++ boost-python

我有关于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中使用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 world world!"也打印出来(在" Hello local world!"打印出来之前)。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

if __name__ == "__main__":

示例:

*script.py*

def local():
    print "local"

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

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