推荐的方法是查询entity
创建对象的命名空间,然后将对象的句柄存储entity
为boost::python::object
. 从 C++ 与 Python 对象交互时,最好尽可能使用boost::python::object
它,因为它提供了一种类似于 Python 变量的高级表示法。此外,它提供了适当的引用计数来管理 Python 对象的生命周期。例如,存储原始指针(即pointerToPythonObj*
)不会延长 Python 对象的生命周期;如果 Python 对象是从解释器内部收集的垃圾,那么pointerToPythonObj
它将是一个悬空指针。
下面是一个例子来证明这一点:
实体.py:
class Entity:
def action(self):
print "in Entity::action"
主.cpp:
#include <boost/python.hpp>
int main()
{
namespace python = boost::python;
try
{
Py_Initialize(); // Start interpreter.
// Create the __main__ module.
python::object main = python::import("__main__");
python::object main_namespace = main.attr("__dict__");
// Import Entity.py, and instantiate an Entity object in the
// global namespace. PyRun_SimpleString could also be used,
// as it will default to running within and creating
// __main__'s namespace.
exec(
"import Entity\n"
"entity = Entity.Entity()\n"
, main_namespace
);
// Obtain a handle to the entity object created from the previous
// exec.
python::object entity = main_namespace["entity"];
// Invoke the action method on the entity.
entity.attr("action")();
}
catch (const python::error_already_set&)
{
PyErr_Print();
}
}
运行上述程序会产生以下输出:
在实体::动作
如果Entity.py
导入失败,则可能需要将其包含目录添加到PYTHONPATH
环境变量中。