gpt4 book ai didi

python - 我可以显式关闭 ctypes CDLL 吗?

转载 作者:太空狗 更新时间:2023-10-29 19:25:33 33 4
gpt4 key购买 nike

我有一个用于与 C 库交互的 Python 2.7 GUI。我在 GUI 中进行了一系列设置,然后按下“开始”按钮。然后,我正在查看结果,不再需要库代码。但我想在更改库时保留所有 GUI 状态。

我用 ctypes 导入了 sodll,这显然会打开文件进行读取。但是,我想明确关闭文件以便重新编译和覆盖它。然后,当我再次按下“开始”按钮时,我想导入新版本。

在最坏的情况下,我可以将文件复制到 tempfile.NamedTemporaryFile,但随后我打开了数十个文件的句柄,我无法清理其中的任何一个。

我能以某种方式显式关闭文件句柄吗?或者,我可以将文件的内容读入 StringIO 对象并以某种方式指向 ctypes 吗?

最佳答案

您需要关闭 DLL 的句柄,以便它先释放,以便您可以使用该文件,您需要获取库的句柄,然后将其传递给 FreeLibrary在 Windows 上,那么您可以使用 DLL 文件执行您需要的操作:

from ctypes import *

file = CDLL('file.dll')

# do stuff here

handle = file._handle # obtain the DLL handle

windll.kernel32.FreeLibrary(handle)

预览:

这是一个测试 DLL:

#include <windows.h>
#include <stdio.h>

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {

switch( fdwReason ) {
case DLL_PROCESS_ATTACH:
puts("DLL loaded");
break;

case DLL_PROCESS_DETACH:
puts("DLL unloaded");
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

return TRUE;
}

__declspec(dllexport) void function(void) {
puts("Hello");
}

预览:

>>> from ctypes import *
>>>
>>> file = CDLL('file.dll')
DLL loaded
>>>
>>> # now it's locked
...
>>> file.function()
Hello
0
>>> windll.kernel32.FreeLibrary(file._handle)
DLL unloaded
1
>>> # not it's unlocked

在 Linux 上你使用 dlclose它将是:

from ctypes import *

file = CDLL('./file.so')

# do stuff here

handle = file._handle # obtain the SO handle

cdll.LoadLibrary('libdl.so').dlclose(handle)

这是一个类似的共享对象:

#include <stdio.h>

__attribute__((constructor)) void dlentry(void) {
puts("SO loaded");
}

void function(void) {
puts("Hello");
}

__attribute__((destructor)) void dlexit(void) {
puts("SO unloaded");
}

预览:

>>> from ctypes import *
>>>
>>> file = CDLL('./file.so')
SO loaded
>>>
>>> file.function()
Hello
6
>>> cdll.LoadLibrary('libdl.so').dlclose(file._handle)
SO unloaded
0
>>>

关于python - 我可以显式关闭 ctypes CDLL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19547084/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com