-
파이썬용 외부 함수 라이브러리
ctypes는 파이썬용 외부 함수(foreign function) 라이브러리입니다. C 호환 데이터형을 제공하며, DLL 또는 공유 라이브러리에 있는 함수를 호출할 수 있습니다. 이 라이브러리들을 순수 파이썬으로 감싸는 데 사용할 수 있습니다.
윈도우는 일반적인 .dll 파일 접미사를 자동으로 추가합니다.
cdll은 표준 cdecl 호출 규칙
windll은 stdcall 호출 규칙
oledll은 stdcall 호출 규칙
함수가 윈도우 HRESULT 에러 코드를 반환한다고 가정합니다. 에러 코드는 함수 호출이 실패할 때 OSError 예외를 자동으로 발생시키는 데 사용됩니다.
리눅스에서 라이브러리를 로드
리눅스에서, 라이브러리를 로드하기 위해서는 확장자를 포함하는 파일명을 지정해야 하므로, 어트리뷰트 액세스를 사용하여 라이브러리를 로드 할 수 없습니다. dll 로더의 LoadLibrary() 메서드를 사용하거나 CDLL의 생성자를 호출하여 인스턴스를 만들어 라이브러리를 로드해야 합니다:
cdll.LoadLibrary("libc.so.6")
<CDLL 'libc.so.6', handle ... at ...>
libc = CDLL("libc.so.6")
libc
<CDLL 'libc.so.6', handle ... at ...>
DLL내부 이름 형태의 함수
dll은 "??2@KAPAXI@Z"와 같은 유효한 파이썬 식별자가 아닌 이름으로 함수를 내보냅니다. 이때는 getattr()를 사용하여 함수를 조회해야 합니다.
getattr(cdll.msvcrt, "??2@KAPAXI@Z")
<_FuncPtr object at 0x...>
서수(ordinal)형태의 함수
윈도우에서, 일부 dll은 이름이 아니라 서수(ordinal)로 함수를 내보냅니다. 이 함수는 서수로 dll 객체를 인덱싱하여 액세스할 수 있습니다:
cdll.kernel32[1]
<_FuncPtr object at 0x...>
cdll.kernel32[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ctypes.py", line 3, in __getitem__
func = _StdcallFuncPtr(name, self)
AttributeError: function ordinal 0 not found
NULL포인터는 python에 None을 사용
print(libc.time(None))
C 호환 데이터형
데이터형 초기화
c_int() #c_long(0)
i = c_int(3) #c_long(3)
print(c_int(3).value) #3
c_wchar_p("Hello") #c_wchar_p(47910784)
c_wchar_p("Asdf").value #"Asdf"
'Python' 카테고리의 다른 글
Python - 인터페이스(interface) 클래스 (0) 2020.06.13 Python - 클래스 함수(static, 정적, 공유) (0) 2020.06.12 Python - 클래스 추상함수 구현 요구 (0) 2020.06.12 Python예제 - ctypes 데이터형 (0) 2019.03.05 Python예제 - 콘솔창 타이틀 이름 변경, 얻기 (0) 2019.03.05 Python예제 목록 (0) 2018.12.10 Python예제 - SMTP Email (0) 2018.10.06 Python예제 - soup.prettify() (0) 2018.02.04