systememerror: Objects/cellobject.c:24:内部函数的错误参数



我正在使用ctypes来处理用C编写的库。这个C库允许我注册一个回调函数,我在Python中实现。

下面是回调函数的类型,根据ctypes API:
_command_callback = CFUNCTYPE(
    UNCHECKED(c_int),
    POINTER(vedis_context),
    c_int,
    POINTER(POINTER(vedis_value)))

这是我写的一个装饰器,用于将函数标记为回调:

def wrap_callback(fn):
    return _command_callback(fn)

要使用它,我可以简单地写:

@wrap_callback
def my_callback(*args):
    print args
    return 1  # Needed by C library to indicate OK response.
c_library_func.register_callback(my_callback)

我现在可以调用我的回调(my_callback)从C和这工作得很好

我遇到的问题是,我希望在这些回调中执行一些样板行为(例如返回成功标志等)。为了尽量减少样板文件,我尝试编写一个装饰器:

def wrap_callback(fn):
    def inner(*args, **kwargs):
        return fn(*args, **kwargs)
    return _command_callback(inner)

注意,这在功能上等同于前面的例子。

@wrap_callback
def my_callback(*args):
    print args
    return 1

当我尝试使用这种方法调用回调时,然而,我收到以下异常,来自_ctypes/callbacks.c:

Traceback (most recent call last):
  File "_ctypes/callbacks.c", line 314, in 'calling callback function'
  File "/home/charles/tmp/scrap/z1/src/vedis/vedis/core.py", line 28, in inner
    return fn(*args, **kwargs)
SystemError: Objects/cellobject.c:24: bad argument to internal function

我不确定这里发生了什么,这将导致第一个例子工作,但第二个例子失败。有人能解释一下吗?如果你能帮我找到一种方法来修饰这些回调,这样我就可以减少样板代码了!

多亏了eryksyn,我才能够解决这个问题。修复如下:

def wrap_callback(fn):
    def inner(*args, **kwargs):
        return fn(*args, **kwargs)
    return _command_callback(inner), inner
def my_callback(*args):
    print args
    return 1
ctypes_cb, my_callback = wrap_callback(my_callback)

相关内容

  • 没有找到相关文章

最新更新