如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python

How to return a pointer to a C++ object to python using boost if the class of that object is declared in another boost module?

本文关键字:boost 对象 返回 python 何使用 指针 声明 C++ 另一个 模块 如果      更新时间:2023-10-16

好吧,也许我找不到答案,因为我不知道如何用词,但我有一个叫Info的类和另一个叫Packet的类,它们都是使用boost编译成Python扩展的,我想从Packet模块返回一个指向Info对象的指针。

info.cpp

#include "info.h"
Info::Info(int i_, int j_){
this->i = i_;
this->j = j_;
} 
Info::~Info(){
}
BOOST_PYTHON_MODULE(Info)
{
class_<Info>("Info", init<int, int>())
.def_readwrite("i", &Info::i)
.def_readwrite("j", &Info::j);
}

Packet.cpp:

Packet::Packet(int i_, int j_, PyObject* addr_, bool a_, bool b_){
this->i = i_;
this->j - j_;
this->addr = addr_;
this->a = a_;
this->b = b_;
}
// some other functions
Info* Packet::test(){
return new Info(1,2);
}
BOOST_PYTHON_MODULE(Packet)
{
class_<Packet>("Packet", init<int, int, PyObject*, bool, bool>())
/*some other functions*/
.def("test", &Packet::test, return_value_policy<reference_existing_object>());
}

testPacket.py:

from Packet import *
# this works correctly
p = Packet(1,2, None, False, False)
# this crashes
t = p.test()

错误消息:

Traceback (most recent call last):
File "/usr/lib64/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/tmp/lirui/testPacket.py", line 5, in <module>
print(p.test())
TypeError: No Python class registered for C++ class Info

有什么方法可以返回一个指向Info对象的指针吗?

感谢

您只导入了Packet

您还需要导入Info

否则,正如错误所说,当p.test()尝试使用它(或者,更具体地说,返回指向它的指针,分配给t(时,Python无法识别它。