스크립트 바인딩은 스크립트 언어에서 C++ API에 접근하는 방법을 제공한다. 보통 C++ 클래스와 함수를 감싸는 래퍼(wrapper) 코드를 만든 후에 각각의 언어에서 모듈을 로딩하는 기능을 이용하여 C++ API에 접근할 수 있다.


그럼 여기서는 Boost Python을 이용하여 python을 위한 C++ API 바인딩 기법을 소개한다.

Boost Python은 C++라이브러리이고 boost안에 존재한다. 그렇기 때문에 boost 라이브러리가 필요하다.

소스 다운로드 및 자세한 정보는 http://www.boost.org/ 이곳을 참고하길 바란다.


참고로 윈도우즈 환경에서 비주얼 스튜디오를 이용하여 진행하였다. 그리고 파이썬3.4가 설치된 상태에서 진행하였다.

boost 라이브러리를 다운받고 적절한 곳에 압축을 푼다. 아래와 같이 압축을 풀었다.

C:\Boost\boost_1_63_0


이제 boost를 빌드해야 하는데 빌드는 비교적 쉽다. 윈도우 명령 프롬프트를 열어 boost 디렉터리로 이동한다.

먼저 bootstrap.bat를 실행한다.

C:\Boost\boost_1_63_0>bootstrap.bat


잠시 후 b2.exe 및 project-config.jam 파일들이 만들어 진다.

project-config.jam 파일을 편집기로 열어 아래처럼 python 버전 및 경로를 명시한다.

import option ;
 
using msvc ;

#  Python configuration
using python : 3.4 : C:\\python34 :  :  : <address-model>64 ;
 
option.set keep-going : false ; 


이제 b2를 실행하여 빌드 진행을 한다. 아래처럼 타이핑한다.

C:\Boost\boost_1_63_0>b2 --toolset=msvc-12.0 --build-type=complete architecture=x86 stage


그러면 빌드가 진행되고 잠시 후 라이브러리들이 빌드가 완료되면 stage/lib 디렉터리안에 deploy된 것을 확인 할 수 있다.

K-003.png


이제 visual studio를 열어 일반-> 빈프로젝트를 생성한다.


프로젝트에 아래 소스들을 추가 시킨다. C++ API디자인의 간단한 예제를 첨부하였다.

phonebook.cpp

phonebook_wrap.cpp

phonebook.h


그리고 프로젝트 속성을 열어서 몇가지 설정을 해주어야 한다.  먼저 동적라이브러리(dll)을 선택하고 일반의 대상 확장명에는 dll을 pyd로 바꿔준다. 

K-005.png


C/C++의 일반에 추가 포함 디렉터리에 아래와 같이 python과 boost의 경로를 추가 시켜준다.

K-006.png


다음은 링커의 추가 라이브러리 디렉터리에 python과 boost의 라이브러리 경로를 추가 시킨다.

K-007.png


설정 완료후 예제를 빌드하면 "phonebook.pyd" 라이브러리 파일(모듈)이 만들어 지고 이를 복사하여 python이 설치된 DLLs 디렉터리에 복사한다. (이 경로는 파이썬이 기본적으로 모듈을 찾는 경로이다.) 그리고 또한가지 boost 라이브러리 도 복사해 주어야 하는데 boost 라이브러리가 있는 stage/lib 디렉터리에서 "boost_python-vc120-mt-gd-1_63.dll" 역시 DLLs 디렉터리에 복사해 준다.


이제 파이썬 스트립트에서 

 import phonebook

위와같이 import를 통해 C++ API를 이용할 수 있다.

아래는 IDLE에서 phonebook을 추가하고 해당 객체를 생성하여 person 객체를 추가하거나 삭제하는 예제를 보여준다.


K-008.png



서비스 선택
댓글
로그인해주세요.
profile image
List of Articles
번호 제목 글쓴이 날짜 조회 수
» Boost Python을 이용하여 python을 위한 C++ API 바인딩 file [레벨:4]id: makerswebmakersweb 2017-01-08 2921
19 [Python]EXE또는 DLL파일의 버전정보를 알아내기위한 몇가지 방법 [레벨:4]id: makerswebmakersweb 2015-06-25 3069
18 [pyqt4]PyQt4 + QML 및 Window 투명처리 file [레벨:4]id: makerswebmakersweb 2015-04-22 2171
17 [pyqt4]QTimer 예제 - 버튼을 누르면 3초후 함수 또는 메소드 호출 [레벨:4]id: makerswebmakersweb 2015-04-01 5081
16 [pyqt4]PyQt4 + QML [레벨:4]id: makerswebmakersweb 2015-03-24 3764
15 [python]print를 로그파일로 생성하기 [레벨:4]id: makerswebmakersweb 2015-03-18 3410
14 [Python]외부 프로그램 실행 pjk 2015-02-10 4564
13 [Python]우분투에 새 버전 설치 사용법 pjk 2015-02-10 2294
12 How to Use Freeze pjk 2014-09-06 3600
11 [PyQt4]개발 프로그램 버전표시 메세지 박스 pjk 2014-09-02 5454
10 [PyQt4]여러가지 버튼 예제 file pjk 2014-08-29 9590
9 Python 문자열 관련 함수 레퍼런스 pjk 2014-08-29 5305
8 [PyQt4]스레드 및 ProgressBar 예제 코드 file pjk 2014-08-26 5115
7 [PyQt4]multiprocess 예제 코드 pjk 2014-08-26 6271
6 [PyQt4]마우스 클릭 이벤트 예제 코드 pjk 2014-08-26 5117
5 [PyQt4]폴더 또는 파일을 드레그하여 그 경로를 LineEdit로 가져오기 file pjk 2014-08-22 5443
4 다른 디렉터리의 파일(모듈) import 하기 pjk 2014-08-22 4388
3 [PyQt4]윈도우창에 별 찍기 예제 file pjk 2014-08-19 6371
2 Python으로 작성된 프로그램을 윈도우응용프로그램(exe)으로 빌드하기 file pjk 2014-08-03 6568
1 파이썬으로 작성된 소스를 py2exe을 이용하여 윈도우 응용프로그램 빌드시 콘솔창 숨기기 pjk 2014-07-29 6600