한국어
파이썬
 

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

 

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

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

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

 

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

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

C:Boostboost_1_63_0

 

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

먼저 bootstrap.bat를 실행한다.

C:Boostboost_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:Boostboost_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

 

번호 제목 글쓴이 날짜 조회 수
24 파이썬으로 작성된 소스를 py2exe을 이용하여 윈도우 응용프로그램 빌드시 콘솔창 숨기기 pjk 2014.07.29 8269
23 Python으로 작성된 프로그램을 윈도우응용프로그램(exe)으로 빌드하기 file pjk 2014.08.03 8689
22 [PyQt4]윈도우창에 별 찍기 예제 file pjk 2014.08.19 8845
21 다른 디렉터리의 파일(모듈) import 하기 pjk 2014.08.22 5297
20 [PyQt4]폴더 또는 파일을 드레그하여 그 경로를 LineEdit로 가져오기 file pjk 2014.08.22 14334
19 [PyQt4]마우스 클릭 이벤트 예제 코드 pjk 2014.08.26 7435
18 [PyQt4]multiprocess 예제 코드 pjk 2014.08.26 8747
17 [PyQt4]스레드 및 ProgressBar 예제 코드 file pjk 2014.08.26 8956
16 Python 문자열 관련 함수 레퍼런스 pjk 2014.08.29 7895
15 [PyQt4]여러가지 버튼 예제 file pjk 2014.08.29 15196
14 [PyQt4]개발 프로그램 버전표시 메세지 박스 pjk 2014.09.02 8613
13 How to Use Freeze pjk 2014.09.06 5866
12 우분투에 Python새 버전 설치 사용법 pjk 2015.02.10 4292
11 외부 프로그램 실행 pjk 2015.02.10 16464
10 print를 로그파일로 생성하기 (log출력 Redirection) makersweb 2015.03.18 6736
9 Python + QML with PyQt4 makersweb 2015.03.24 9013
8 [pyqt4]QTimer 예제 - 버튼을 누르면 3초후 함수 또는 메소드 호출 makersweb 2015.04.01 10872
7 QML 및 Window 투명처리 file makersweb 2015.04.22 5219
6 [Python]EXE또는 DLL파일의 버전정보를 알아내기위한 몇가지 방법 makersweb 2015.06.25 9954
» Boost Python을 이용하여 python을 위한 C++ API 바인딩 [5] file makersweb 2017.01.08 10496