我正在设置和打开这样的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的等效项。
感谢。
答案 0 :(得分:2)
抱歉,CFFI无法明确调用C级dlclose()
。只有在库对象超出范围时才会隐式调用它。此外,ffi
对象使此库保持活动状态,因此ffi
也需要超出范围。
如果您真的想这样做,则需要确保对mylib
和ffi
的所有引用都已消失,并致电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