我有一个Python 2.7 GUI用于与C库交互.我在GUI中做了一堆设置,然后按"go"按钮.然后,我正在查看结果,不再需要库代码.但我想在更改库时保持所有GUI状态.
我导入so
或dll
使用ctypes
,显然打开文件进行阅读.但是,我想显式关闭该文件,以便重新编译并覆盖它.然后,当我再次按下"go"按钮时,我想导入新版本.
在最糟糕的情况下,我可以将文件复制到一个tempfile.NamedTemporaryFile
,但后来我有几十个文件的句柄,没有一个我可以清理.
我可以以某种方式显式关闭文件句柄吗?或者,我可以将文件的内容读入StringIO
对象并以某种方式指向该对象ctypes
吗?
小智 5
您需要关闭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)
Run Code Online (Sandbox Code Playgroud)
预习:
这是一个测试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");
}
Run Code Online (Sandbox Code Playgroud)
预习:
>>> 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
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
这是一个类似的共享对象:
#include <stdio.h>
__attribute__((constructor)) void dlentry(void) {
puts("SO loaded");
}
void function(void) {
puts("Hello");
}
__attribute__((destructor)) void dlexit(void) {
puts("SO unloaded");
}
Run Code Online (Sandbox Code Playgroud)
预习:
>>> from ctypes import *
>>>
>>> file = CDLL('./file.so')
SO loaded
>>>
>>> file.function()
Hello
6
>>> cdll.LoadLibrary('libdl.so').dlclose(file._handle)
SO unloaded
0
>>>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4499 次 |
最近记录: |