Ctypes
위키백과 ― 우리 모두의 백과사전.
ctypes 는 순수 파이썬 만을 이용해 윈도우의 dll 이나 윈도우의 so 같은 공유 라이브러리를 사용할 수 있게 해주는 모듈 입니다.
파이썬에는 이미 pyd 를 이용한 언어 확장 방식을 가지고 있었지만, 파이썬 버전별로 pyd 파일이 호환이 되지 않았습니다. 같은 기능을 하는 공유 라이브러리라 할지라도 파이썬 버전별로 배포를 해야 하는 건 상당히 번거로운 일이었습니다.
이런 문제를 해결하기 위해 파이썬에서 직접 공유라이브러리 함수를 호출해 C 언어 형식 자료를 읽어오는 ctypes 모듈이 추가되었습니다. 포인터나 레퍼런스 타입도 사용 가능하며, 운영체제에 독립적인 인터페이스를 제공하는 다른 모듈과는 달리 특정 플랫폼에 특화된, 예를 들어 윈도우의 POINT 나 RECT 등의 자료형 등도 지원하고 있습니다.
목차 |
[편집] 라이브러리 불러오기
공유 라이브러리들은 각기 함수 호출 규약을 가지고 있습니다. 대표적인 함수 호출 규악은 cdecl 과 pascal 입니다. 사용에 있어 가장 큰 차이점은 pascal 방식은 정해진 인자 개수만을 지원한다면 cdecl 은 printf 나 scanf 같이 가변적인 인자 개수를 지원합니다. 하지만 cdecl 방식은 언어에서 특별히 지원하지 않는다면 사용할 수가 없기 때문에, 윈도우 표준 API 는 pascal 방식을 사용하며 표준적인 호출 방식 stdcall 이라고 부릅니다.
ctypes 는 이러한 함수 호출 규약에 대해서 직접 지정해 주어야 합니다. cdecl 방식을 사용한다면 ctypes.cdll 을 사용 해야 하며, pascal/stdcall 방식을 사용한다면 ctypes.windll 을 사용 해야 합니다. ctypes.oledll 이라는 것도 있는 이것은 stdcall 을 따르며 HRESULT 를 리턴 값으로 가지는 함수들의 호출 방식입니다. stdcall 과 다른 점은 에러 발생시 WindowsError 라는 python 예외를 발생시켜 준다는 점입니다.
다음은 kernel32 와 msvcrt 라 부르는 MS 표준 C 라이브러리를 불러오는 예제입니다.
>>> from ctypes import * >>> windll.kernel32 <WinDLL 'kernel32', handle 7c800000 at b50750> >>> windll.msvcrt <WinDLL 'msvcrt', handle 77bc0000 at b46490> >>>
윈도우에서 ctypes 를 이용해 라이브러리를 불러올 때는 dll 확장자를 안 붙여주셔도 됩니다.
반면 리눅스에서는 직접 ctypes.cdll.LoadLibrary 라는 함수를 이용해 라이브러리를 로드해 주어야 합니다.
[편집] 공유 라이브러리 함수 사용하기
불러온 공유 라이브러리의 함수는 일반적인 python 모듈의 함수처럼 접근 가능합니다.
>>> from ctypes import * >>> printf = cdll.msvcrt.printf >>> printf("haha") haha4 >>>
msvcrt.printf 를 실행해본 예제입니다. haha 와 4라는 숫자가 출력되었는데 뒤의 숫자 4는 printf 의 리턴 값으로 출력된 문자열의 길이입니다. 파이썬 인터프리터가 대화식이기 때문에 출력되는 것으로 무시해도 괜찮습니다. 그럼에도 불구하고 출력되지 않게 하고 싶다면 restype 이라는 걸 사용하시면 됩니다.
>>> printf.restype = None >>> printf("haha") haha>>> printf("haha\n") haha