嵌入式Python:从导入的模块获取func obj

时间:2011-07-25 11:44:49

标签: c++ python boost

我有一个Python模块,我从我的C ++代码导入(我嵌入了Python)。这个模块包含一个函数create(),我希望在我的C ++代码中保存它(即将它存储在boost::python::object实例中)。

这是我尝试过的。在我的C ++代码中指示的行上发生运行时错误。发生错误是因为它无法在主命名空间中找到“hero.create”函数。

C ++代码

namespace python = boost::python;

// Standard Boost.Python code
// Here I just create objects for the main module and its namespace

python::object main_module(
    python::handle<>(python::borrowed(PyImport_AddModule("__main__")))
);

python::object main_namespace(main_module.attr("__dict__"));


// This is my code
//

python::exec("import hero", main_namespace, main_namespace);
python::object func(main_namespace["hero.create"]); // Run-time error
Entity ent = python::extract<Entity>(func());

// I also tried doing this, but it didn't work either...
// python::object func(main_namespace["hero"].attr("__dict__")["create"]);

// However, if I do this, all works fine...
// python::exec("from hero import create", main_namespace, main_namespace);
// python::object func(main_namespace["create"]); // No error

Python代码( hero.py

from entity import Entity

def create():
    ent = Entity()
    # ...
    return ent

1 个答案:

答案 0 :(得分:3)

您需要main_namespace["hero"].attr("create")。 Import只在命名空间中创建一个名称,它是一个模块对象。名称中不能包含点 - .是getattr运算符 - 因此hero.creategetattr(hero, 'create')相同。

您也可以直接使用boost::python::import,而不是使用exec import语句。