파이썬은 참 매력적인 언어입니다. 리스트, 튜플, 딕셔너리 같은 자료형들이 기본적으로 제공되고, 풍부한 라이브러리는 물론 쓰기도 편리합니다. 그리고 다른 언어와도 잘 어울립니다. 흔히 이를 일컬어 '풀 언어 (glue language)'라고 하죠.
/* 사실 저는 그동안 '풍부한 자료형'과 '쉽고 강력한 라이브러리'의 덕을 충분히 보아 오긴 했습니다만, 아직 다른 언어와의 교착(binding)이란 면에서 직접적으로는 큰 인상을 받지 못했습니다. 물론 간접적으로 알게 모르게 상당히 큰 혜택을 받아오긴 했었다는 사실을 알고 있지만요. 예를 들어 보통 GTK, wxWidget 등의 GUI 라이브러리들을 파이썬에서 사용할 때는 wxPython 등의 파이썬 패키지를 사용하는데, 이런 패키지들은 C/C++로 작성된 라이브러리들을 바인딩하고 있죠. 몇몇 파이썬 표준 라이브러리들도 이런 형태를 취하고 있는 것으로 알고 있습니다. */
파이썬은 C/C++에 비해 수행 속도가 느립니다. 대신 매우 생산성이 높습니다. 그러니 둘 사이를 잘 절충하여 좋은 구현을 만들어 보자는 것이 핵심이겠죠. 이는 두 가지로 방법으로 이해해볼 수 있습니다.
문서나 웹을 검색해보면 'extending/extended'와 'embedding/embedded'라는 표현이 상당히 자주 보입니다. 우선 이 extending, embedding이란 단어가 무얼 뜻하는지 짚고 넘어가겠습니다.
파이썬에서 extending, 즉 '확장'했다는 말은 파이썬 측에서 다른 언어를 바인딩하여 다른 언어가 제공하는 기능을 활용하는 것입니다. 파이썬에서 C/C++ 코드를 쓰는 것은 이 예입니다. 본 문서는 이 부분을 다루지는 않습니다만 'extended python'이란 용어 자체는 '확장된 파이썬', python extension은 '파이썬 확장'이라고 해석하도록 하겠습니다.
Extending의 반대입니다. 파이썬이 다른 코드에 '삽입'되었다는 뜻이며 C/C++에서 파이썬 코드를 쓴다는 것은 이 쪽의 예입니다. 본 문서에서는 'embedded python'을 '삽입된 파이썬'으로, 'python embedding'은 '파이썬 삽입' 정도로 번역해 쓰겠습니다. Extending은 차후에 기회가 된다면 따로 다룰 생각이며, 본 문서에서는 삽입된 파이썬에 대해서만 다룹니다.
파이썬을 삽입하는 주체가 되는 언어는 C/C++로 한정하겠습니다. 사실 C 이외에 여러 다양한 언어가 파이썬과의 통합을 지원합니다. 심지어 같은 스크립트 언어인 Perl과도 가능합니다. 가능한 언어의 종류는 파이썬 위키를 참고하세요.
파이썬 삽입을 하게 되면 다음과 같은 장점을 가집니다.
그러나 다음과 같은 사항은 꼭 고려해 보셔야 합니다.
파이썬 언어가 시스템에 설치되어 있어야겠죠. 각 플랫폼별로 나누어 간략하게 설명하겠습니다.
윈도우는 모든 언어의 인터프리터, 컴파일러를 별도로 설치해야 합니다. 이 점은 좀 번거롭죠
아무튼 2014년 3월 현재, Python 2.X의 최신 버전은 2.7.6이므로 문서는 이 버전의 파이썬을 기준으로 기록합니다. http://www.python.org/downloads/ 에서 윈도우용을 다운로드 받습니다. 단 64비트 시스템에서는 주의할 점이 한 가지 있습니다. 64비트 C 컴파일러를 사용한다면 파이썬도 64비트 버전을, 32비트 C 컴파일러를 사용한다면 32비트 버전의 파이썬을 설치하세요. 이걸 지키지 않으면 빌드할 때 에러가 발생합니다. 물론 64비트 시스템에 32비트 버전 파이썬을 설치해도 파이썬 인터프리터 실행이나 파이썬 스크립트 실행 만이라면 문제가 되지 않습니다.
설치한 후 환경변수 설정을 해 주어야 쓰기 편하죠. 기본적으로 C:\Python27
에 파이썬이 설치되니까 PATH에 C:\Python27
을 추가합니다. 아래와 같이 명령 프롬프트를 아무 경로에서 실행해 보아 파이썬 동작을 확인합니다.
> python --version
Python 2.7.6
별도로 파이썬 패키지 설치를 한다면 setuptools를 설치합니다. 환경변수를 설정한 후, setuptools-x.x.tar.gz
를 다운로드 받은 다음 압축을 풀고, 압축을 풀어낸 디렉토리로 이동한 후
> python setup.py install
하면 설치가 됩니다. 이렇게 하면 C:\Python27\Scripts
에 easy_install.exe
가 생성됩니다. C:\Python27
을 환경변수에 등록한 방법과 동일하게 C:\Python27\Scripts
또한 환경변수에 등록합니다. 마찬가지로 임의의 경로에서 easy_install을 실행하여 환경변수 등록을 확인합니다.
>easy_install --version
setuptools 2.2
'pip'도 패키지 관리에 편합니다. easy_install이 설치되었다면 간단하게 다음 명령으로 설치 가능합니다.
>easy_install pip
....
pip가 패키지 삭제 기능도 있어 좀 더 편리합니다.
본 문서에서는 직접적으로 easy_install이나 pip를 직접적으로 필요로 하지 않습니다. 설치 시 참고만 하시면 됩니다.
배포판별로 차이가 조금씩 있겠지만, 리눅스는 거의 기본적으로 파이썬이 포함되어 있습니다. 문서의 설명을 따라해 보기 위해서는 파이썬 2버전에 맞춰 주기만 하면 됩니다.
맥도 기본적으로 파이썬이 탑재되어 있어 별도로 설정할 필요는 없습니다.
비주얼 스튜디오에서 빌드하려면 따로 include path, library path를 프로젝트 설정에서 지정해 주어야 합니다. Property sheet를 사용하는 것이 편리하겠죠.
불행히도, 또는 일반적으로도 그렇듯이 유닉스 계열에 비해 윈도우 쪽이 빌드할 때 훨씬 불편합니다. 일단 윈도우에서는 이후 설명할 python-config-X.Y
를 사용할 수가 없습니다. 파이썬 자체에서 제공하는 sysconfig 모듈을 이용하는 방법도 있으나 이마저도 빌드에 필요한 모든 정보가 제공되지는 않습니다. 대체로 .lib
파일은 C:\Python27\libs
에 설치됩니다.
또한 디버그 버전 빌드 때에는 링킹 단계에서 python27_d.lib
파일을 찾을 수 없다는 메시지까지 나옵니다. 파이썬 공식 홈페이지에서 받은 인스톨러 패키지에는 디버그 버전의 라이브러리가 빠져 있기 때문입니다. python27_d.lib
파일을 온전히 생성하려면 파이썬 소스를 받아다 직접 컴파일해야 합니다.
참고로 파이썬은 bzip, Berkely DB, OpenSSL, SQLite, Tcl/Tk에 의존성이 있고, 또 의존성 패키지들은 Perl과 NASM 등을 필요로 합니다. 윈도우에 패키지 관리자가 있었으면 참 좋겠는데 하는 생각이 들죠. 아무튼 비주얼 스튜디오를 이용하는 경우 직접 파이썬을 빌드하지 않는 한 좀 아쉽더라도 릴리즈 모드를 이용해야 할 겁니다.
MinGW를 이용한다면 -I
옵션과 -L
옵션, 그리고 -lpython27
옵션까지 다 집어 넣으면 되겠습니다. 인스톨러에 libpython27.a
가 같이 제공됩니다.
>gcc -o <output> <input> -I "C:\Python27\include" -L "C:\Python27\libs" -lpython27
리눅스에서는 python-config
을 통해 좀 더 편하게 설정을 알아낼 수 있습니다. 시스템에 따라 'python2.7-config'이나 'python-config-2.7' 처럼 약간 차이는 있을 수 있습니다. 이 명령어로 파이썬 자체가 빌드될 때 컴파일 옵션, 링커 플래그 등을 알아낼 수 있습니다.
–cflags
, 혹은 –ldflags
의 값들은 파이썬 자신이 빌드될 때의 설정인지라 반드시 준수해야 할 것은 아닙니다. 경우에 따라서 헤더 파일의 경로, 라이브러리 경로와 라이브러리 이름만 지정해도 충분합니다.
그래도 적절히 이식성 좋은 컴파일 명령어를 위해서는 다음 정도가 적절합니다.
$ gcc -o <output> <input> `python-config --includes` `python-config --libs`
리눅스의 방법과 동일하게 진행하면 됩니다. 파이썬의 경로가 조금 다르다거나 python-config의 이름이 약간 다르다는 것을 제외하고는 거의 다른 점이 없습니다.