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