我在各种 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 或应用程序终止时尽快删除,以免留下临时垃圾关于)。