【发布时间】:2019-02-08 14:06:28
【问题描述】:
我正在尝试使用 ctypes 与 Python 共享 C++ 对象,方法是在 C++ 中创建对象,并通过 C 包装器将指针传递给 Python。我希望稍后能够使用 Python 类中的其他函数对这个对象进行操作,do_something 在下面的代码中。
我尝试了以下代码,但出现了段错误。我是 C 与 C++ 和 C 与 Python 接口的新手,所以我不确定在传递指针时我是否在做一些根本性错误,或者内存是否被 Python 垃圾收集清除/移动,之后我创建对象?
This question 讨论了类似的 boost 问题,但答案对 ctypes 不是很有用。
object.h
class object {
public:
// constructor
object() {
pointer = nullptr;
}
// destructor
virtual ~object() {
delete pointer;
pointer = nullptr;
}
// get member functions of object_pointer
// from C++
double do_something();
protected:
// pointer to the object
object_pointer *pointer;
};
extern "C" {
object* object_new();
void object_delete(object *Ob);
double object_do_something(object *Ob);
}
object.cpp
#include "object.h"
double object::do_something() { return pointer->do_something(); }
extern "C" {
object *object_new() { return new object(); }
void object_delete(object *Ob) { delete Ob; }
double object_do_something(object *Ob) { return Ob->do_something(); }
}
object.py
>from ctypes import *
lib = cdll.LoadLibrary('./lib_object.so')
lib.object_new.argtypes = ()
lib.object_new.restype = c_void_p
lib.special_delete.argtypes = c_void_p,
lib.special_delete.restype = None
lib.object_pointer.argtypes = c_void_p
lib.object_pointer.restype = c_void_p
class Object:
def __init__(self):
self.obj = lib.object_new()
print self.obj
def __del__(self):
lib.object_delete(self.obj)
def do_something(self):
lib.object_do_something(self.obj)
s = Object()
>> 94549743086144
s.do_something()
>> Segfault
任何帮助将不胜感激!
【问题讨论】:
-
你用什么命令将object.cpp编译成lib_object.so?
-
你有没有换过
pointer?否则pointer->do_something()取消引用空指针。另外,为什么是S->do_something()而不是Ob->do_something? -
抱歉
S->do_something()打错了,我已经修正了 -
指针确实发生了变化:一个对象是从一个字符缓冲区重建的,然后
pointer指向该对象 -
argtypes 应该是一个列表(或 tuple):
lib.object_pointer.argtypes = [c_void_p].