我有一个简单的例子,我试图将控制权转移到python代码中。 A类的字段myFunction
是我想要传输控件的python方法。
cpp代码:
class A {
private:
PyTypeObject* myFunction;
bool flag = true;
public:
A() {
Py_Initialize();
};
void setFunc(PyTypeObject* func) {
myFunction = func;
}
void runFunc(double a) {
std::cout << PyType_Check(myFunction);
// I want to call python method here
}
void loop() {
while (flag) {
runFunc(12);
sleep(2);
}
}
};
extern "C" { // this is interface for calling cpp methods with ctypes
A* new_a() {
return new A();
}
void a_setFunc(A* a, PyTypeObject* func) {
return a->setFunc(func);
}
void loop(A* a) {
return a->loop();
}
}
python代码:
from ctypes import cdll
libA = cdll.LoadLibrary('build/Debug/libpop.so')
def foo():
print 'a'
class A():
def listener(self, a):
print str(a + 2)
def __init__(self):
self.object = libA.new_a()
def setFunc(self):
return libA.a_setFunc(self.object, self.listener) #here is an error
def run(self):
return libA.loop(self.object)
test = A()
test.setFunc()
test.run()
当我运行py代码时,我遇到以下错误:
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2
如何解决此问题?
答案 0 :(得分:1)
在Python C API中,PyTypeObject*
是指向描述Python类型的结构的指针。我认为你正在寻找PyObject*
这是一个指向Python对象的指针,这就是你瞄准的目标。
这是另一个具有类似解决方案的问题:how to deal with the PyObject* from C++ in Python