我想使用Python中的C ++类和ctypes库:
我的C ++课程:
class ClassAInteface
{
protected:
ClassAInterface() {}
public:
virtual ~ClassAInteface() {}
virtual void MethodA() = 0;
};
class ConcreteClassA : public ClassAInteface
{
public:
ConcreteClassA();
virtual ~ConcreteClassA();
//ClassAInteface Methods
void MethodA();
};
//Second class which uses the First class
class ClassB
{
public:
ClassB(ClassAInteface* firstClass);
virtual ~ClassB();
void MethodB(int param);
}
现在我想在Python中使用CTypes这个类:
extern "C" {
ConcreteClassA* ConcreteClassA_new() { return new ConcreteClassA(); }
void MethodA(ConcreteClassA* classA) { classA->MethodA(); }
ClassB* ClassB_new(ConcreteClassA* classA) { return new ClassB(classA); }
void MethodB(ClassB* classB,int param) {dl->MethodB(param); }
}
在Python中使用第一个类可以正常使用: ...导入共享库... - > sharedLib
#Create a Python Class
class ClassA(object):
def __init__(self):
self.obj = sharedLib.ConcreteClassA_new()
def MethodA(self):
sharedLib.MethodA(self.obj)
objA = ClassA()
但是当我想在Pyhton中使用第二个和第一个类时:
class ClassB(object):
def __init__(self,firstClass):
self.obj = sharedLib.ClassB_new(firstClass)
def Drive(self):
sharedLib.MethodB(self.obj,angle)
objA = ClassA()
objB = ClassB(objA)
我明白了:
self.obj = sharedLib.ClassB_new(firstClass)ctypes.ArgumentError: 参数1 ::不知道如何转换 参数1
我认为没有抽象课它会起作用吗? 但是我如何轻松地在Python中使用我的类?
答案 0 :(得分:0)
ctypes如何知道使用obj
属性?使用_as_parameter_
。
首先,确保您正在设置参数和结果类型。 ctypes默认使用C int
,这将使64位指针无效。
sharedLib.ConcreteClassA_new.restype = c_void_p
sharedLib.ClassB_new.restype = c_void_p
sharedLib.ClassB_new.argtypes = [c_void_p]
sharedLib.MethodA.restype = None
sharedLib.MethodA.argtypes = [c_void_p]
sharedLib.MethodB.restype = None
sharedLib.MethodB.argtypes = [c_void_p, c_int]
class ClassA(object):
def __init__(self):
self._as_parameter_ = sharedLib.ConcreteClassA_new()
def MethodA(self):
sharedLib.MethodA(self)