2

我正在设置并打开这样的 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()

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

谢谢。

4

2 回答 2

2

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

如果你真的想这样做,你需要确保所有对myliband的引用ffi都消失了,然后调用gc.collect(). (如果你想重新加载,你需要重新开始ffi = FFI()。)

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

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

于 2015-04-11T14:35:59.830 回答
1

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

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

于 2017-03-03T04:29:20.303 回答