我正在设置并打开一个DLL,如下所示:

from cffi import FFI
ffi = FFI()

api_path = '/path_to/api.h'
lib_path = '/path_to/lib.so'
with open(api_path) as f:
   ffi.cdef(f.read())
mylib = ffi.dlopen(lib_path)

myfunc_c = ff.callback('int (char *)', myfunc)
#etc...


如何关闭磁带库并再次打开?如果我做

del mylib


然后再次尝试上面的代码,当我得到CDefError: cannot parse ...
尝试ffi.cdef()

我已经看到了一些使用dlclose()的ctypes的示例,但是找不到与CFFI等效的示例。

谢谢。

最佳答案

抱歉,CFFI无法显式调用C级dlclose()。仅当库对象超出范围时才隐式调用。另外,ffi对象使该库保持活动状态,因此ffi也需要超出范围。

如果确实要执行此操作,则需要确保所有对mylibffi的引用均已消失,然后调用gc.collect()。 (如果要重新加载,则需要重新添加新的ffi = FFI()。)

下一版本的CFFI可能会添加ffi.close_libraries()之类的内容,以卸载此ffi对象中加载的库。

编辑:它不适用于在CPython上加载verify()的库,因为这些库是常规的CPython C扩展模块,并且CPython从不卸载其C扩展模块。这意味着一般的ffi.close_libraries()想法可能注定了...

关于python - 干净地卸载共享库并从Python CFFI重新开始,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29567200/

10-12 16:32