干净地卸载共享库并重新使用Python CFFI

时间:2015-04-10 17:19:40

标签: python python-cffi

我正在设置和打开这样的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的等效项。

感谢。

2 个答案:

答案 0 :(得分:2)

抱歉,CFFI无法明确调用C级dlclose()。只有在库对象超出范围时才会隐式调用它。此外,ffi对象使此库保持活动状态,因此ffi也需要超出范围。

如果您真的想这样做,则需要确保对mylibffi的所有引用都已消失,并致电gc.collect()。 (如果您希望重新加载,则需要重新开始使用新的ffi = FFI()。)

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

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

答案 1 :(得分:1)

dlclose(lib)存在,但仅适用于外线/预编译的FFI。

http://cffi.readthedocs.io/en/latest/cdef.html#ffi-dlopen-loading-libraries-in-abi-mode