2015-09-23 4 views
-2

В Windows У меня есть DLL, которую мы сделали сами, среди других загружает другую DLL. Проблема в том, что при использовании DLL в Matlab с loadlibrary, calllib и unloadlibrary все в порядке.Выгрузить DLL, загруженную в Python

В Python я попытался использовать ctypes и cffi, оба с одинаковыми результатами. Я могу загрузить функции DLL и вызова, но я не могу выйти снова. Python зависает, и я должен закончить задачу из Диспетчера задач.

С ctypes Я пытался позвонить

import _ctypes 
_ctypes.FreeLibrary(lib._handle) 

как предложено здесь Free the opened ctypes library in Python без эффекта. Кроме того, я попытался вызвать явную функцию для выгрузки другой DLL.

Может ли кто-нибудь дать подсказку или решение, почему она не будет выгружаться/висит?

+0

Связанный дубликат содержит два ошибочных ответа. Для принятого ответа обратите внимание, что модуль расширения '_ctypes' определяет' dlclose' и 'FreeLibrary'. Эти функции повышают «OSError», когда библиотека больше не может быть освобождена, поэтому нет причин для функции «isLoaded» Piotr. Более того, его утверждение о том, что «ctypes сохраняет внутренние ссылки на этот дескриптор», выглядит просто составленным. Экземпляр '_handle' используется только для объявления. Нет причин для 'del' экземпляра' CDLL' (т. Е. Завершить его, предполагая одну ссылку). – eryksun

ответ

-1

Я нашел часть ответа здесь How can I unload a DLL using ctypes in Python?

Apperently один должен вызывать позвонить _ctypes.FreeLibrary напрямую.

# Release DLL(?) 
handle= lib._handle 
_ctypes.FreeLibrary(handle) 
+0

Вы нашли ответ на сайте. Этот вопрос следует удалить или закрыть как дубликат, не отправленный с тем же ответом. –

+0

Независимо от того, что 'del' решает, я заверяю вас, что он ничего не делает с целью разгрузки DLL. В моем примере я этого не делал, но, очевидно, выполнялся код 'DLL_PROCESS_DETACH'. Пожалуйста, прочитайте исходный код для '' CDLL' '(https://hg.python.org/cpython/file/v2.7.10/Lib/ctypes/__init__.py#l332). Время жизни экземпляров 'CDLL' не имеет никакого отношения к освобождению библиотеки. ctypes * never * вызывает 'FreeLibrary'. Когда Петр говорит: «ctypes держит внутренние ссылки на этот дескриптор», я не совсем уверен, что он имеет в виду, но очевидная интерпретация неверна. – eryksun

+0

@eryksun Вы абсолютно правы, я исправил свой ответ, удалив вызов 'del'. Он ничего не делал. –

Смежные вопросы