4

我在各种 Python 代码库中看到的在运行时动态生成/加载 C 函数的常见习语是:

import tempfile
import shutil
from ctypes import CDLL

workdir = tempfile.mkdtemp()
try:
    # Generate and write code in workdir
    # ...
    # Compile and link into an .so/.dylib/.dll
    # ...
    lib = CDLL(path_to_lib)
finally:
    shutil.rmtree(workdir)

虽然这似乎在 *nix 系统上工作得很好,但我不确定它在 Win32 上的工作情况如何。这是因为,根据我的经验,当临时目录中的 .dll 映射到进程时,无法取消链接。因此,rmtree会失败。

我可以使用哪些选项来确保在 Win32 上尽快删除 .dll(及其所在的目录)(以便在底层lib被 gc'ed 或应用程序终止时尽快删除,以免留下临时垃圾关于)。

4

1 回答 1

2

使用 Kernel32 函数FreeLibrary取消映射 DLL 并减少其引用计数。要获取句柄,您可以使用GetModuleHandleW,但它已经在_handle属性中可用。

编辑:底层_ctypes模块已经提供了这个功能以及dlclosePOSIX。如果出现错误,这些函数会引发WindowsError/ OSError

>>> import os                               
>>> from ctypes import *  
>>> from _ctypes import FreeLibrary

>>> lib = CDLL('./lib.dll')
>>> hlib = lib._handle
>>> del lib
>>> FreeLibrary(hlib)

>>> os.remove('./lib.dll')
>>> os.path.exists('./lib.dll')
False
于 2013-03-22T08:35:32.190 回答