我有一个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
答案 0 :(得分:3)
您需要main_namespace["hero"].attr("create")
。 Import只在命名空间中创建一个名称,它是一个模块对象。名称中不能包含点 - .
是getattr运算符 - 因此hero.create
与getattr(hero, 'create')
相同。
您也可以直接使用boost::python::import
,而不是使用exec
import语句。