====== ctypes ====== C언어의 자료형을 다루고 DLL을 호출할 수 있는 라이브러리. 파이썬 2.5버전부터 기본으로 포함되어 있다. ===== 자료형 ===== ^C Type ^Python Type ^ctypes Type^ |bool |bool(1) |c_bool| |char |1-character string |c_char| |wchar_t |1-character Unicode string |c_wchar| |char |int/long |c_byte| |unsigned char |int/long |c_ubyte| |short |int/long |c_short| |unsigned short |int/long |c_ushort| |int |int/long |c_int| |size_t |int/long |c_size_t| |unsigned int |int/long |c_uint| |long |int/long |c_long| |unsigned long |int/long |c_ulong| |long long |int/long |c_longlong| |unsigned long long |int/long |c_ulonglong| |float |float |c_float| |double |float |c_double| |long double |float |c_longdouble| |char * (NULL terminated) |string or none |c_char_p| |wchar_t * (NULL terminated) |unicode or none |c_wchar_p| |void * |int/long or none|c_void_p| ==== 예제 ==== from ctypes import * print c_ushort(-5) seitz = c_char_p("loves the python") print seitz print seitz.value 결과 c_ushort(65531) c_char_p('loves the python') loves the python ===== 포인터, 참조자 ===== 포인터 타입의 내용에 접근하려면 value 속성을 이용한다. seitz = c_char_p("loves the python") print seitz.value char *, wchar_t *, void *가 아닌 포인터를 선언하려면 POINTER를 이용한다. 다음 코드는 int * 형의 변수 x 를 선언하고 NULL로 초기화한다. x = POINTER(c_int)() POINTER로 선언한 변수의 내용은 contents 속성으로 확인할 수 있다. C/C++의 함수 중 포인터를 넘겨야 하는 경우 사용하는 참조자는 아래와 같이 사용한다. functionname( byref(parameter) ) ===== 구조체, 공용체 ===== 구조체, 공용체의 선언은 Structure, Union 클래스를 상속받아 한다. ==== C 구조체 ==== struct beer_recipe { int amt_barley; int amt_water; }; ==== ctypes 구조체 ==== class beer_recipe(Structure): _fields_ = [ ("amt_barley", c_int), ("amt_water", c_int), ] ==== C 공용체 ==== union { long barley_long; int barley_int; char barley_char[8]; }barley_amount; ==== ctypes 공용체 ==== class barley_amount(Union): _fields_ = [ ("barley_long", c_long), ("barley_int", c_int), ("barley_char", c_char * 8), ] ==== 구조체의 포인터 ==== class test(Structure): _fields_ = [ ("a", c_ushort), ("b", c_ushort) ] s = POINTER(test) s = s(test()) # s = POINTER(test)(test()) 로 선언하여도 된다. s.contents.a = 1 s.contents.b = 2 ===== DLL 호출 ===== 함수의 타입에 따라 다음 3가지 함수를 사용할 수 있다. ==== cdll() ==== cdecl 호출 규약을 따르는 함수를 export하는 라이브러리 로딩 ==== windll() ==== stdcall 호출 규약을 따르는 함수를 export하는 라이브러리 로딩 ==== oledll() ==== windll()과 동일하나 HRESULT 에러 코드를 호출하는 COM 함수를 export하는 라이브러리를 로딩한다. ==== 예제 ==== 다음은 msvcrt.dll의 printf를 호출하는 예제이다. from ctypes import * msvcrt = cdll.msvcrt message_string = "Hello world!\n" msvcrt.printf("Testing: %s", message_string) ===== 참고 ===== * [[http://python.net/crew/theller/ctypes/|ctypes 공식 홈페이지]] \\