>  기사  >  백엔드 개발  >  Python에서 dll 라이브러리를 호출하는 방법

Python에서 dll 라이브러리를 호출하는 방법

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼원래의
2019-06-13 11:51:1326652검색

어떤 경우에는 Python에서 효율성을 보완하기 위해 C가 필요합니다. 실제 응용 프로그램에서는 일부 데이터 상호 작용이 필요합니다. Python에서 ctypes 모듈을 사용하면 Windows DLL(Linux의 so 파일 포함)을 쉽게 호출할 수 있습니다. 이 모듈은 아래에서 자세히 설명합니다(Windows 플랫폼을 예로 들어). Windows에서 작성하면 문제가 되지 않습니다.

Python에서 dll 라이브러리를 호출하는 방법

ctypes 라이브러리 소개

from ctypes import *

이미 DLL(이름은 add.dll)이 있고 DLL에 cdecl이 있다고 가정합니다(여기에서는 stdcall 호출 규칙 및 cdecl 호출 규칙 문으로 인해 호출 규칙이 강조됨). Python으로 로딩할 때 사용하는 내보내기 함수가 다릅니다. 나중에 설명하겠습니다.) 합의된 내보내기 함수 Add를 호출합니다.

관련 권장 사항: "python 비디오 튜토리얼"

Python 파일 만들기 DllCall.py 테스트:

from ctypes import *  
dll = CDLL("add.dll")  
print dll.Add(1, 102)

결과: 103

위는 간단한 예입니다. 호출 프로세스에 대해 간략히 설명하겠습니다.
1. DLL 로드
위에서 언급한 것처럼 로드할 때는 호출하려는 함수의 호출 규칙을 따라야 합니다.
stdcall 호출 규칙: 두 가지 로드 방법

Objdll = ctypes.windll.LoadLibrary("dllpath")  
Objdll = ctypes.WinDLL("dllpath")

cdecl 호출 규칙: 두 가지 로드 방법도 있습니다.

Objdll = ctypes.cdll.LoadLibrary("dllpath")  
Objdll = ctypes.CDLL("dllpath")  
/*其实windll和cdll分别是WinDLL类和CDll类的对象。*/

2. DLL에서 메서드를 호출합니다.

1에서 DLL을 로드할 때 DLL 객체가 반환됩니다( 이름은 Objdll 임), 이 개체를 사용하여 dll의 메서드를 호출할 수 있습니다.

e.g.dll에 Add라는 메서드가 있는 경우(해당 메서드가 stdcall에 의해 선언된 경우 def 파일이나 extern "C"에 선언된 내보낸 함수가 아닌 경우 컴파일러는 함수 이름을 수정합니다.) 이 점에 유의하시기 바랍니다. )
Call: nRet = Objdll.Add(12, 15), 호출이 완료됩니다.
겉모습만 보지 마시고 호출이 매우 간단한 것 같습니다. ㅎㅎ, Add 함수가 너무 간단하기 때문입니다. 이제 함수에 int 유형 포인터(int*)를 전달해야 한다고 가정하면, 라이브러리에서 byref 키워드를 사용할 수 있습니다. 구현하려면 지금 호출되는 함수의 세 번째 매개변수가 int 유형의 포인터라고 가정합니다.

intPara = c_int(9)  
dll.sub(23, 102, byref(intPara))  
print intPara.value

char 버퍼 포인터와 버퍼 길이를 전달하려면 최소한 네 가지 방법이 있습니다:

# 方法1  
szPara = create_string_buffer('/0'*100)  
dll.PrintInfo(byref(szPara), 100);  
print szPara.value    
# 方法2  
sBuf = 'aaaaaaaaaabbbbbbbbbbbbbb'  
pStr = c_char_p( )  
pStr.value = sBuf  
#pVoid = ctypes.cast( pStr, ctypes.c_void_p ).value  
dll.PrintInfo(pStr, len(pStr.value))  
print pStr.value    
# 方法3  
strMa = "/0"*20  
FunPrint  = dll.PrintInfo  
FunPrint.argtypes = [c_char_p, c_int]  
#FunPrint.restypes = c_void_p  
nRst = FunPrint(strMa, len(strMa))  
print strMa,len(strMa)    
# 方法4  
pStr2 = c_char_p("/0")  
print pStr2.value  
#pVoid = ctypes.cast( pStr, ctypes.c_void_p ).value  
dll.PrintInfo(pStr2, len(pStr.value))  
print pStr2.value

3. C 기본 유형 및 ctypes에 구현된 유형 매핑 테이블
ctypes 데이터 유형 C 데이터 유형
c_char char
c_short
c_int short
c_long int
c_long unsign long
c_float float
c_double double
c_void_p void
해당 포인터 유형에는 "_p"가 추가됩니다(예: int*는 c_int_p 등).
파이썬에서 C 언어의 구조를 구현하려면 클래스를 사용해야 합니다.
4. DLL의 함수는 포인터를 반환합니다.
좋은 프로그래밍 방법은 아니지만 이 상황을 처리하는 방법도 매우 간단합니다. 실제로 모든 주소를 반환하고 해당 Python 유형으로 변환한 다음 value 속성을 통해 액세스합니다.

pchar = dll.getbuffer()  szbuffer = c_char_p(pchar)  print szbuffer.value

5. C에서 구조 유형 처리
이것을 별도로 언급하는 이유는 Python에서 C와 유사한 구조를 선언하려면 클래스를 사용해야 하며 이 클래스는 다음에서 상속해야 합니다. 구조.

예:
Python 코드는 다음과 같습니다.

def CreateGUID():        
"""      
创建一个全局唯一标识符      
类似:E06093E2-699A-4BF2-A325-4F1EADB50E18      
NewVersion      
"""        
try:            
# dll path            
strDllPath = sys.path[0] + str(os.sep) + "createguid.dll"            
dll = CDLL(strDllPath)            
b = dll.newGUID()            
a = c_char_p(b)        
except Exception, error:            
print error            
return ""        
return a.value

예 2:
이 예는 kernel32.dll에서 createprocessA 함수를 호출하여 메모장 프로세스를 시작합니다.

아아아아

위 내용은 Python에서 dll 라이브러리를 호출하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.