4

実行時に C 関数を動的に生成/ロードするために、さまざまな Python コード ベースで見た一般的なイディオムは次のとおりです。

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ですか約)。

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 に答える