C로 파이썬 모듈 작성하는 법

파이썬 모듈은 보통 파이썬으로 만드는데, 파이썬 코드 내에서 다른 파일을 import하면 반입되는 파이썬 코드가 컴파일되어 동적으로 링크된다. 그런데 파이썬 인터프리터는 C로 만들어졌으므로, 왠지 C에서 작성한 코드를 파이썬에서 사용할 수 있을 것 같은 느낌적 느낌이들고, 반대로 파이썬 코드도 C에서 사용할 수 있을 것 같은 느낌적 느낌이 든다.

일단 이 “느낌적 느낌”들은 실제로도 그러하다. 물론 C에서 파이썬 모듈을 호출해서 사용하는게 속도면에서도 이득이 없는데, 뭔 소용이 있겠냐고 하는데 모르시는 말씀. 당장 정규식으로 문자열 파싱하는 모듈을 작성한다고 생각해보자. C에서는 머리가 지끈거릴 일이겠지만, 상대적으로 파이썬에서의 정규식 사용은 매우 쉽다!!!

Python C API

파이썬과 C의 접점에는 파이썬 C API가 있다. 위에서 언급한 C 코드를 파이썬에서 사용하거나, 파이썬 모듈의 함수를 C에서 사용하는 것은 이를 통해 가능하다. 여기서는 간단한 예를 들어 파이썬에서 C 코드로 모듈을 만드는 법을 살펴보자. 간단히 말해 다음 3 단계가 필요하다.

  1. 파이썬 라이브러리 및 API를 사용해서 모듈을 작성한다.
  2. 이를 컴파일하여 동적 라이브러리로 만든다. (.so / .pyd)
  3. 만들어진 동적 라이브러리를 호출한다.

파일 보기

헤더파일 위치

시스템마다 조금씩 다를 수 있다. find 명령으로 찾은 다음 distutils 로그에 적힌 경로를 만들어서 링크해준다. /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7이 원래 링크이므로,

sudo mkdir /usr/include && cd /usr/include

sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7

와 같이 링크를 생성해준다.

라이브러리 파일

-lpython27 옵션을 주는 줄 알았는데 -undefined dynamic_lookup 옵션이 이를 대체하는 것 같다. 또한 링크시에 -shared가 아닌 -bundle 옵션을 쓴다.

** 수동 컴파일 **

gcc -c -fPIC mymod.c -I /usr/include

Python.h 파일이 필요한데, 적절한 위치를 찾아볼 것. 라이브러리의 위치는 못찾겠더라 대신 -undefined dynamic_lookup 옵션으로 링크하여 라이브러리를 생성한다.

gcc -bundle -o mymod.so mymod.o -undefined dynamic_lookup

이렇게 하면 mymod.so 파일이 만들어지는데 이를 그대로 파이썬 모듈처럼 사용하면 된다.

win32 환경

gcc -mdll -c mymod.c -O3

위와 같이 컴파일하고, 다음과 같이 링크한다.

gcc --shared mymod.o -o mymod.pyd -lpython27 -L c:\python27\libs