我正在设置并打开一个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
也需要超出范围。
如果确实要执行此操作,则需要确保所有对mylib
和ffi
的引用均已消失,然后调用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/