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

2024-10-01 15:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

根据ctypes API,以下是回调函数类型:

_command_callback = CFUNCTYPE(
    UNCHECKED(c_int),
    POINTER(vedis_context),
    c_int,
    POINTER(POINTER(vedis_value)))

下面是我编写的一个修饰符,用于将函数标记为回调:

^{pr2}$

为了使用这个,我可以简单地写下:

@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)

我现在可以从C调用我的回调(my_callback),并且这非常有效。在

我遇到的问题是,作为这些回调的一部分,我想执行一些样板行为(例如返回成功标志等)。为了尽量减少样板,我试图写一个装饰:

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

我不确定是什么原因导致第一个例子起作用,而第二个例子失败。有人能解释一下吗?如果你能帮助我找到一种方法来装饰这些回调,这样我就可以减少样板代码了!在


Tags: 函数returnmydefcallbackargs样板ctypes
1条回答
网友
1楼 · 发布于 2024-10-01 15:29:00

多亏了埃里克森,我才得以解决这个问题。修复看起来像:

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)

相关问题 更多 >

    热门问题