윈도우에서 SWIG로 Python과 C/C++ 인터페이싱 하기

일단 환경 설정이 여기서는 정말 중요하다.

내가 알기로는 Python2.4 이상은 Visual C++ 7.1 공개 컴파일러로 컴파일 되어 있어 C/C++로 확장 모듈을 만들려면 반드시 컴파일 환경이 구비가 되어 있어야 한다.

외국 문서중에 아주 좋은문서가 있어서 첨부 시킨다.

Building Python Extensions with the MS Toolkit Compiler

위 문서그대로 하면 윈도우에서 Python 확장모듈을 만드는 모든 환경이 구비가 되는 셈이다.

게다가 나의 경우에는 SWIG로 인터페이스 모듈을 만들었으니 그 모듈도 설치를 하면 된다.

물론 관건은 이 swig의 환경 설정 파일인 *.i 파일을 어떻게 만드느냐인데, 이건 해당 사이트에 매뉴얼이 굉장히 방대하고 또한 C/C++에 대한 확실한 이해가 필요한 부분이므로 일단 생략 한다.

그렇지만 내가 사용한 문서 필터 인터페이싱 설정 파일 예제를 올려본다.

%module sn3f

%{
#include
#include “sn3win.h”
#include “sn3f.h”
%}

 

%typemap(freearg) char* DoctoTxt(char *input){ /* 입력인자 메로리 해제 */
free($1);
}

%typemap(freearg) char* HtmltoTxt(char *input){
free($1);
}

%typemap(freearg) char* TXTtoTxt(char *input){
free($1);
}

%typemap(freearg) char* PDFtoTxt(char *input, int WithPage){
free($1);
}

%typemap(freearg) char* MSDOCtoTxt(char *input){
free($1);
}

%typemap(out) char* { /* 리턴되는 문자열의 메모리를 헤제하는 중요한 부분 */
$result = PyString_FromString($1);
free($1);
}

char* DoctoTxt(char*); /* 함수 원형 선언 */
char* HtmltoTxt(char*);
char* TXTtoTxt(char*);
char* PDFtoTxt(char*, int);
char* MSDOCtoTxt(char*);

내용을 보면 알겠지만, 이 파일이 굉장히 중요한 역할을 한다.
잘못 작성을 했다가는 메모리 누수 현상이 발생할수도 있는 중요한 부분이다.

이 파일 작성을 하는데, 하루가 걸렸다. 물론 이런저런 테스트 메모리 누수 테스트까지 거치는 와중에 그랬지만, 이정도의 예제가 나오기까지 정말 힘들었다.

이거 말고 다른 setting 파일은 setup.py 파일인데 이 파일은 빌드하는 환경을 설정하는 파일이다. 이 파일이 인터페이스 파일과 실제 구현소스를 연결해 컴파일하는 정보를 가지고 있다.

이 파일은 인터넷에 여러 예제가 있으니 일단 skip한다.

SWIG를 이용해 Linux 및 Unix Windows 환경에서 모두 빌드해봤지만 역시나 Linux나 Unix환경이 조금 편하다. 기본적으로 Gcc가 깔려 있어서 그런지 바로 실행을 하면 컴파일이 가능했으니까.

실제 SWIG로 Generate되는 파일인 cxx 파일을 분석해볼 필요가 있는데, 아직 해보지를 못했다. (귀차니즘)
쉬는날 언젠가 날 잡아서 분석해볼만한 가치가 있을거 같다.

Python과 C/C++이 잘 붙는다는 소문이 있는데, 이건 정말 소문일뿐이라는 이야기를 하고 싶다.
절대 인터페이싱하는거 만만치 않다. 두가지 언어를 통달하고 각각의 문법차이점을 확실히 이해를 한 사람만이 ‘인터페이싱 식은죽 먹기다’ 라는 말을 할수 있을거 같다.

Python이 Glue 언어라는말 절대 아무나 할수 있는 말이 아니다.
직접 해봤다면 이런이야기 쉽게할수 없다.

CC BY-NC 4.0 윈도우에서 SWIG로 Python과 C/C++ 인터페이싱 하기 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.