为了账号安全,请及时绑定邮箱和手机立即绑定

python(ctypes)中的回调问题

python(ctypes)中的回调问题

慕婉清6462132 2022-10-06 16:19:52
我在 python 中遇到了 CTYPES 的问题。我已经准备好带有一些回调的 dll 库。在 swift 上一切正常,但我在 python 中有一些问题。Python:def set_up_callback(self):    self.lib.set_callback(self.callback1)@CFUNCTYPE(None, c_float, c_float, c_float, c_uint64)def callback1( a, b, c, time):    print(a, b, c, time)c++回调声明typedef void(*callbackType)(float, float, float, uint64_t, void*);        callbackType callback;void* context;C++ 初始化void setCallback(callbackType callback, void* context) {        this->context = context;        this->callback = callback;}C++ 归纳callback(1.5f, 2.4f, 1.3f, timestamp, context);共享.hextern "C" void SHARED_EXPORT set_callback(callbackType callback, void* context);这很好用,但我想要selfIn 回调函数,所以我试试这个def set_up_callback(self):    callback_type = CFUNCTYPE(None, c_float, c_float, c_float, c_uint64)    callback = callback_type(self.callback1)    self.lib.set_callback(callback)def callback1(self, a, b, c, time):    print(a, b, c, time)通过这个尝试我有错误Segmentation fault: 11预先感谢您的帮助
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

In set_up_callback,callback是一个局部变量,在调用 后超出范围self.lib.set_callback(callback)。callback您必须在可以调用的生命周期内保留对的引用,因此将其存储为类实例的成员变量。


工作演示:


演示.cpp


#include <time.h>

#include <stdint.h>


#if defined(_WIN32)

#   define API __declspec(dllexport)

#else

#   define API

#endif


typedef void(*CALLBACK)(float, float, float, uint64_t, void*);


CALLBACK g_callback;


extern "C" {


API void set_callback(CALLBACK callback) {

    g_callback = callback;

}


API void demo(void* context) {

    if(g_callback)

        g_callback(1.5f, 2.4f, 1.3f, time(nullptr), context);

}


}

演示.py


from ctypes import *

from datetime import datetime


CALLBACK = CFUNCTYPE(None,c_float,c_float,c_float,c_uint64,c_void_p)


class Demo:

    def __init__(self):

        self.lib = CDLL('./demo')

        self.lib.set_callback.argtypes = CALLBACK,

        self.lib.set_callback.restype = None

        self.lib.demo.argtypes = c_void_p,

        self.lib.demo.restype = None

        self.set_up_callback()


    def callback(self,a,b,c,timestamp,context):

        print(a,b,c,datetime.fromtimestamp(timestamp),self.context)


    def set_up_callback(self):

        self.callback = CALLBACK(self.callback)

        self.lib.set_callback(self.callback)


    def demo(self,context):

        self.context = context

        self.lib.demo(None)


demo = Demo()

demo.demo([1,2,3])

demo.demo(123.456)

demo.demo('a context')

输出:


1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 [1, 2, 3]

1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 123.456

1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 a context


查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信