Вы должны быть в состоянии сделать это, выбрасывая объект
mydll = ctypes.CDLL('...')
del mydll
mydll = ctypes.CDLL('...')
РЕДАКТИРОВАТЬ: Комментарий Хопа является правильным, это отменяет привязку имени, но сборка мусора происходит не так быстро, на самом деле я даже сомневаюсь, что она даже освобождает загруженную библиотеку.
Ctypes, похоже, не обеспечивает чистого способа освобождения ресурсов, он только предоставляет поле _handle
для дескриптора dlopen ...
Таким образом, единственный способ, по-настоящему, действительно неочищенный способ , состоит в том, чтобы система зависимо закрывала дескриптор, но это очень и очень нечисто, так как, кроме того, ctypes внутренне сохраняет ссылки на этот дескриптор. Таким образом, выгрузка происходит в следующем виде:
mydll = ctypes.CDLL('./mylib.so')
handle = mydll._handle
del mydll
while isLoaded('./mylib.so'):
dlclose(handle)
Это так нечисто, что я только проверил, что работает, используя:
def isLoaded(lib):
libp = os.path.abspath(lib)
ret = os.system("lsof -p %d | grep %s > /dev/null" % (os.getpid(), libp))
return (ret == 0)
def dlclose(handle)
libdl = ctypes.CDLL("libdl.so")
libdl.dlclose(handle)