用C++将C++对象传递给Python

2024-07-03 05:38:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄清楚如何使用boostpython在c++中创建一个对象并将其传递给python。我已经设法做到了这一点,但却无法进行垃圾回收。在

设想类A是用C++定义的。passNewAToPython()函数从代码中的其他地方调用,该函数创建一个对象,然后将其传递给Python中的回调函数。我希望这个特定的实例传递给python,而不是一个副本,因此使用ptr()

static PyObject * pythonCallbacks;

void passNewAToPython()
{
  A * a = new A();
  PyGILState_STATE _GILState = PyGILState_Ensure();
  //Should really use a try catch here too but lets ignore that for now
  boost::python::call_method<void>(pythonCallbacks, "newA", boost::python::ptr(a));
  PyGILState_Release(_GILState);
}

void initmodule(PyObject* userCallCallbacks_)
{
   PyEval_InitThreads();

   pythonCallbacks = userCallCallbacks_;
}

BOOST_PYTHON_MODULE(mymodule)
{
    def("initmodule", initmodule);

    class_<A, boost::noncopyable>("A", init<>());
}

Python代码

^{pr2}$

现在想象一下调用newA回调之后的一段时间。我只希望存储a实例的位置是在一个\u列表中。因此,如果我从一个_列表中删除一个,那么我希望对我用new创建的对象调用c++delete。那是永远不会发生的,所以我会漏掉东西。在

我尝试了很多不同的技术来做到这一点,但从来没有设法使所有的工作。我真的很感激一个完整的例子,也许能展示如何修改上面的例子。在


Tags: 对象实例函数代码newpyobjectboostptr
1条回答
网友
1楼 · 发布于 2024-07-03 05:38:25

我很确定ptr()与所指向对象的生存期无关。如果你用它来管理你的一生,这完全取决于你自己。(我相信使用它就像使用PyCObject一样。)

您可以将A的指针类型定义为共享的\ptr(boost或std都不重要)。像这样:

class_<A, shared_ptr<A>, boost:noncopyable>("A", init<>());

然后您可以让您的工厂功能执行以下操作:

^{pr2}$

相关问题 更多 >