Cleanly unload shared library and start over with Python CFFI
Question: I'm setting up and opening a DLL like this:

    
    
    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...
    

How can I close the library and open it again? If I do

    
    
    del mylib
    

and try the above code again I get `CDefError: cannot parse ...` when
attempting `ffi.cdef()`.

I've seen some examples for ctypes using `dlclose()` but can't find an
equivalent for CFFI.

Thanks.


Answer: Sorry, CFFI has no way to call explicitly the C-level `dlclose()`. It is only
called implicitly if the library object goes out of scope. Also, the `ffi`
object keeps this library alive, so `ffi` needs to go out of scope too.

If you really want to do it, you need to make sure all references to `mylib`
and `ffi` are gone, and call `gc.collect()`. (If you want then to reload, you
need to start again with a fresh `ffi = FFI()`.)

The next version of CFFI might add something like `ffi.close_libraries()` that
unloads the libraries loaded in this `ffi` object.

**EDIT:** it won't work for libraries loaded with `verify()` on CPython,
because these ones are regular CPython C extension modules, and CPython never
unloads its C extension modules. This means that the general
`ffi.close_libraries()` idea might be doomed...

