한국어
파이썬

 

스크립트 바인딩은 스크립트 언어에서 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

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
21 pydbus 바인딩을 이용하여 서비스 데몬과 D-Bus통신 file makersweb 2018.03.12 128
» Boost Python을 이용하여 python을 위한 C++ API 바인딩 file makersweb 2017.01.08 3231
19 [Python]EXE또는 DLL파일의 버전정보를 알아내기위한 몇가지 방법 makersweb 2015.06.25 3259
18 QML 및 Window 투명처리 file makersweb 2015.04.22 2382
17 [pyqt4]QTimer 예제 - 버튼을 누르면 3초후 함수 또는 메소드 호출 makersweb 2015.04.01 5502
16 Python + QML with PyQt4 makersweb 2015.03.24 3853
15 [python]print를 로그파일로 생성하기 makersweb 2015.03.18 3495
14 [Python]외부 프로그램 실행 pjk 2015.02.10 5044
13 [Python]우분투에 새 버전 설치 사용법 pjk 2015.02.10 2321
12 How to Use Freeze pjk 2014.09.06 3653
11 [PyQt4]개발 프로그램 버전표시 메세지 박스 pjk 2014.09.02 5553
10 [PyQt4]여러가지 버튼 예제 file pjk 2014.08.29 9740
9 Python 문자열 관련 함수 레퍼런스 pjk 2014.08.29 5359
8 [PyQt4]스레드 및 ProgressBar 예제 코드 file pjk 2014.08.26 5338
7 [PyQt4]multiprocess 예제 코드 pjk 2014.08.26 6385
6 [PyQt4]마우스 클릭 이벤트 예제 코드 pjk 2014.08.26 5300
5 [PyQt4]폴더 또는 파일을 드레그하여 그 경로를 LineEdit로 가져오기 file pjk 2014.08.22 5550
4 다른 디렉터리의 파일(모듈) import 하기 pjk 2014.08.22 4440
3 [PyQt4]윈도우창에 별 찍기 예제 file pjk 2014.08.19 6474
2 Python으로 작성된 프로그램을 윈도우응용프로그램(exe)으로 빌드하기 file pjk 2014.08.03 6769