Python의 기본 모듈 중 하나인 ctypes를 이용해서 C언어로 컴파일된 dll안에 넣은 함수를 실행하는 방법을 기록한다. 우리가 사용하고자 하는 C 함수의 인풋과 아웃풋 형식만 잘 맞춰주어야 한다는 것만 기억하면 어렵지 않은 일이다. 계산 속도를 올리기 위해서 C언어를 이용할 때, 더 나아가 CUDA 등의 병렬계산을 이용하고자 할 때 유용하게 이용할 수 있다. 여기서 C코딩이나 CUDA를 다루지는 않는다. 나는 Microsoft Visual Studio 2013 community edition과 Python 2.7.11을 사용하였다.
1. C/C++ 코드
함수를 선언할 때 _stdcall 을 붙여주어서 표준통신규약을 지키게 해야 한다고 한다 (뭔지 잘 모름).
## 파일명: dllfunction.cpp
double _stdcall myfunc(double a, int b) {
// YOUR CODE...
}
def 파일을 추가해서 추가하고자 하는 함수를 EXPORT 다음에 추가한다.
## 파일명: Source.def
LIBRARY "dll-myfunc"
EXPORT
myfunc
프로젝트 설정을 dll 타입에 맞게 한 뒤 컴파일을 하면 DLL 파일이 생성된다.
2. Python 코드
만든 DLL을 Python에서 사용하기 위해서는 아래 코드를 참조한다. 여기서 DLL 파일 이름은 mydll.dll이고, 경로 설정은 잘 해줄 것. dictionary 타입처럼 함수에 접근할 수 있고, argtypes와 restype을 C/C++에서 선언한 타입과 맞춰주어야만 제대로 DLL 함수를 실행할 수 있다. argtypes는 꼭 tuple이나 list타입으로 써줘야 한다.
import ctypes as c
mydll = c.WinDLL('mydll')
myfunc = mydll['myfunc']
myfunc.argtypes = (c.c_double, c.c_long,)
myfunc.restype = c.c_double
res = myfunc(5.5, 1)
ctypes 모듈은 포인터와 배열, 구조체 등에 대한 타입도 지원하기 때문에 다양하게 C/C++ 타입에 접근할 수 있다. 이에 대한 내용도 시간이 된다면 추가하려 하지만 우선 여기까지만 기록한다.
참고 자료
Python 공식 문서: ctypes에 대해 넘나 많은 것들이 설명되어있다. 단번에 스토리가 이해되지 않을 수도 있으니 구글링+stackoverflow를 통해 차근차근 찾아봐야 할 수도 있다.
https://docs.python.org/2/library/ctypes.html
'Programming > Python' 카테고리의 다른 글
Python Celery with Redis: 비동기 작업 큐(queue) (0) | 2016.09.25 |
---|---|
Python requests 모듈 간단 정리 (22) | 2016.08.10 |
PDFMiner 설치: Python에서 pdf를 html이나 text파일로 변환 (9) | 2016.04.30 |
Django Form에서 DOM class 설정 등의 front-end 조작법 (0) | 2016.04.02 |
무분별한 회원가입을 막는 Google Recaptcha 사용법 (0) | 2016.03.26 |