Programming/Python

C/C++ dll로 만든 함수를 Python에서 사용 (feat. ctypes)

동건 2016. 6. 11. 21:40

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 타입처럼 함수에 접근할 수 있고, argtypesrestype을 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


반응형