c로 작성된 python module 만들기
C로 작성된 함수를 파이썬에서 import 해서 사용하기 위해서는 C로 작성된 프로그램 코드를 파이썬이 import할 수 있는 라이브러리 파일로 변환해 주어야 한다. (ubuntu 환경에서 할거임)
swig(Simplified Wrapper and Interface Generator)라는 툴을 사용하면 간단히 라이브러리파일로 만들어 낼 수 있다. swig는 파이썬뿐만 아니라 다른 언어에서도 C코드를 사용가능하게 라이브러리를 만들어주는 툴이다.
설치
sudo apt-get install swig
공식 홈페이지
www.swig.org
위의 간단한 코드를 라이브러리로 만들어서 파이썬에서 실행 시켜보자.
ex.c파일을 이용해서 ex.i 파일을 만들어줘야 한다. 보통 컴파일러를 사용하면 전처리기가 해주는 작업을 비스무리하게 직접하여 .i파일을 만들어 줘야 한다.
첫 번째 줄에는 %(module name)이 들어가고
%{
이 부분에는 사용하는 함수들의 선언, 전역변수(구조체)의 선언, define, 헤더파일을 extern으로 선언해준다.
%}
그리고 그 밑에는 그냥 한 번 더써준다.
ex.c파일을 이용해서 ex.i 파일을 만들어줘야 한다. 보통 컴파일러를 사용하면 전처리기가 해주는 작업을 비스무리하게 직접하여 .i파일을 만들어 줘야 한다.
첫 번째 줄에는 %(module name)이 들어가고
%{
이 부분에는 사용하는 함수들의 선언, 전역변수(구조체)의 선언, define, 헤더파일을 extern으로 선언해준다.
%}
그리고 그 밑에는 그냥 한 번 더써준다.
ex.c 파일과 ex.i 파일이 준비가 되었다. 이제 swig를 이용해서 만들면 된다.
swig -python ex.i
명령어를 실행하면 ex_wrap.c와 life.py가 생성된다. life는 모듈이름이고 ex는 c코드 파일명이다.
gcc -fpic -c ex.c ex_wrap.c -I/usr/include/python2.7
object 파일 두 개(ex.o ex_wrap.o)가 생성되었다. -I뒤에는 Python.h 를 참조할수 있게 파이썬이 설치된 경로를 넣으면 된다. 나머지 옵션은 man gcc에 들어가면 확인할 수 있다.
ld -shared ex.o ex_wrap.o -o _life.so
_life.so 파일을 뽑아준다. .so 파일이름은 반드시 _(module name)으로 해야한다.
python 을 실행하고 import 해서 사용할 수 있다.
굳~
C로 작성된 함수에서 인자로 포인터를 받는 경우 그냥 느낌에 맞게 넣자(char * 는 string형으로)
ctype의 (c_char_p) 이런걸로 형 맞춰줘도 되지 않는다.
unsigned char * 같은 걸 넘겨주려면 string (char *)으로 넘겨주고 C코드 안에서 인자를 받자마자 강제 형변환을 해버리니 잘 된다.
ex) argv[1] = (unsigned char *)argv[1]
함수의 결과 값을 return으로 받지 않고 argv의 구조체 인자로 받으면 받아지지 않는다.
우옹..
답글삭제좋은 포스팅 감사합니다!
답글삭제