带有抽象类的Python ctypes

时间:2013-12-18 15:59:59

标签: c++ python ctypes

我想使用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中使用我的类?

1 个答案:

答案 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)