使用Boost::Python获取一个指向Python实例的c++指针
Get a c++ pointer to a Python instance using Boost::Python
我正在将Python嵌入C++应用程序中。当我在Python中创建一个新对象时,我希望能够在C++应用程序中存储对该对象的引用,以便以后可以调用该对象上的方法。推荐的方法是什么?
例如,我希望能够做这样的事情:
实体.py
class Entity:
def getPointer(self)
return pointertoSelf;
Manager.cpp
Py_Initialize();
PyRun_SimpleString("import Entity");
PyRun_SimpleString("entity = Entity.Entity()");
pointerToPythonObj* = somehowGetPointerToObj("entity");
建议的方法是查询创建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"
main.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 Entityn"
"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
环境变量中。
相关文章:
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- Python C API:如何检查对象是否是类型的实例
- 字节或整数地址预期,而不是str实例python 3
- swig c to python:抛出一个中止的实例后终止
- 如何使用 boost::p ython 创建和使用 Python 对象的实例
- 在python ctypes中截断了指向C++自定义类实例的指针地址
- 如何使用 SWIG 将 Python 类实例作为 C++ 函数的参数传递
- Python 可以运行脚本的多个实例,每个实例都包含自己的数据吗?
- 如何通过 Python/C API 将 Python 实例传递给 C++
- 用c++对象的全局实例扩展嵌入式python解释器
- boost python返回与makeconstructor相同的实例
- boost.python 解释器实例化
- 使用Boost::Python获取一个指向Python实例的c++指针
- 使用SWIG和Python/C API来包装一个函数,该函数采用C++类实例的Python列表
- 在BOOST_Python_MODULE宏之外将C++实例传递到Python中
- 实现具有自动增量实例属性的类的最python的方式是什么?
- 如何创建一个公共python函数,它可以接收c++结构体/实例或python对象作为参数
- 从Python中的另一个实例获取实例
- 向python嵌入式解释器公开c++类实例
- 如何从C++返回 Python 类型的实例