我正在尝试将
这是我尝试过的代码:
很遗憾,来自 C 的回调没有起作用。你能发现我做错了什么或者提出修复的建议吗?
Cython
实例类对象作为参数传递给 C
函数,以便它可以回调到它的方法。这是我尝试过的代码:
#include "python.h"
void c_func(PyObject *obj){
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
/* Dictionary Object - can be of any dynamic type */
PyObject *dict_obj = PyDict_New();
PyObject *key = PyUnicode_FromString("average-run");
PyObject *val = PyLong_FromLong(45445);
PyDict_SetItem(dict_obj, key, val);
/* Make a callback */
PyObject_CallMethod(obj, "func_a", "(d)", dict_obj);
PyGILState_Release(gstate);
}
cdef extern from "sample.h":
void c_func(object obj)
cdef class Test(object):
cdef func_a(self, object dict_obj)
cimport pysample
from pysample cimport Test
cdef class Test(object):
cdef func_a(self, object dict_obj):
print(dict_obj)
def run_test(self):
# Here I make a call to the C function
pysample.c_func(self)
很遗憾,来自 C 的回调没有起作用。你能发现我做错了什么或者提出修复的建议吗?
PyObject * args
,则PyObject_CallMethodObjArgs()
是更快的替代方法。”(https://docs.python.org/2/c-api/object.html) - DavidWPyObject_CallMethod(obj, "func_a", "(O)", dict_obj);
(将字典作为通用 Python 对象传递),它就能正常工作。 - DavidW