문제

Python에 DLL을로드하기 위해 CTYPES를 사용하고 있습니다. 이것은 훌륭합니다.

이제 런타임에 해당 DLL을 다시로드 할 수 있습니다.

간단한 접근 방식은 다음과 같은 것 같습니다 : 1. DLL 2.로드 DLL

불행히도 나는 DLL을 내리는 올바른 방법이 무엇인지 잘 모르겠습니다.

_ctypes.Freelibrary를 사용할 수 있지만 개인.

DLL을 내릴 수있는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

객체를 처리하여 수행 할 수 있어야합니다.

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

편집하다: Hop의 의견은 맞습니다. 이것은 이름을 밝히지 만, 쓰레기 수집은 빨리 일어나지 않습니다. 실제로로드 된 라이브러리를 공개하는 것도 의심합니다.

CTypes는 자원을 릴리스하는 깨끗한 방법을 제공하지 않는 것 같습니다. _handle Dlopen 손잡이에 필드 ...

그래서 내가 보는 유일한 방법, 정말로 정말 비 청소 방식, CTYPES 가이 핸들에 대한 내부적으로 참조를 유지하기 때문에, 손잡이를 의존적으로 dlclose하는 것이지만, 매우 부정된다. 따라서 언 로딩은 다음과 같은 형태를 취합니다.

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에서 작업하면 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 호출은 Windows에게 해방하도록 지시합니다. 프리 리바리로 먼저 자유롭게 해방하면 문제가 발생했을 것이므로 도서관 핸들의 사본을 저장하고 예제에 표시된 순서대로 해제했습니다.

이 방법을 기반으로합니다 CTYPES 언로드 DLL 손잡이를 명시 적으로 앞쪽으로로드했습니다. 그러나 로딩 컨벤션은 간단한 "ctypes.cdll.loadlibrary ( 'test.dll')만큼 깨끗하게 작동하지 않으므로 표시된 방법을 선택했습니다.

이 기능이 필요한 경우 DLL_A가 DLL_B에서 라이브러리를로드/언로드하는 경우 2 개의 DLL을 작성할 수 있습니다. DLL_A를 Python Interface-Loader로 사용하고 DLL_B의 함수에 대한 패스 스루로 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top