質問

を使用していctypesロDLL。この作品です。

現していきリロードするDLLを行います。

の簡単なアプローチが見られるようにする:1.アンロードDLL 2.負荷DLL

残念ながらお使いいただくことによっては、正しい荷役しなければならないというのDLLです。

_ctypes.FreeLibraryが可能です。

あるその他の荷役しなければならないというのDLL?

役に立ちましたか?

解決

対応することができるでしょうかを処理することにより、オブジェクト

mydll = ctypes.CDLL('...')
del mydll
mydll = ctypes.CDLL('...')

編集: Hopコメントは、このunbindsの名前、ごみ収集が起こりませんが、実際にはいっても間違いでもリリース、ロードされた図書館があります。

Ctypesがあるようには見えません綺麗にリリース資源でのみを提供 _handle フィールドをdlopenハンドル---

ように一生懸命頑張りましたか 本当非清方, は、システム依存的にdlcloseの取扱い基準を満たしており、安全面でも非常に汚れ、またctypes常に社内で参照のこと。なので水揚げものの形式:

mydll = ctypes.CDLL('./mylib.so')
handle = mydll._handle
del mydll
while isLoaded('./mylib.so'):
    dlclose(handle)

で汚れることだけで作品を用い:

def isLoaded(lib):
   libp = os.path.abspath(lib)
   ret = os.system("lsof -p %d | grep %s > /dev/null" % (os.getpid(), libp))
   return (ret == 0)

def dlclose(handle)
   libdl = ctypes.CDLL("libdl.so")
   libdl.dlclose(handle)

他のヒント

あなたがiPythonまたは類似の作業の流れを使用している場合は、セッションを再起動せずにDLLを再構築することができるようにDLLをアンロードできるようにすると便利です。ウィンドウでの作業私は、WindowsのDLL関連の方法で動作するようにしようとしています。

REBUILD = True
if REBUILD:
  from subprocess import call
  call('g++ -c -DBUILDING_EXAMPLE_DLL test.cpp')
  call('g++ -shared -o test.dll test.o -Wl,--out-implib,test.a')

import ctypes
import numpy

# Simplest way to load the DLL
mydll = ctypes.cdll.LoadLibrary('test.dll')

# Call a function in the DLL
print mydll.test(10)

# Unload the DLL so that it can be rebuilt
libHandle = mydll._handle
del mydll
ctypes.windll.kernel32.FreeLibrary(libHandle)

私はので、私はこれがどのようにきれいに本当にわからないんだけど、内部の多くを知りません。私はMYDLLを削除すると、Pythonのリソースを解放し、FreeLibraryの呼び出しは、それを解放するために窓を伝えていると思います。私は、ライブラリハンドルのコピーを保存し、例に示すためにそれを解放したように、第1 FreeLibaryを解放すると、問題が生じたであろうことを前提としていた。

私は ctypesの前まで明示的にハンドルをロードしたDLL にアンロードにこの方法をベース。荷重則しかし、単純な「ctypes.cdll.LoadLibrary( 『TEST.DLL』)」としてきれいに動作しませんので、私が示した方法を選択しました。

この機能が必要な場合は、2つのDLL dll_Bからdll_Aロード/アンロードライブラリを書くことができます。 dll_Bでの機能のためのPythonインタフェースローダおよびパススルーなどとしてdll_Aを使用してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top