한국어
파이썬
 

스크립트 바인딩은 스크립트 언어에서 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 pybind11 에 대해서 makersweb 2023.07.23 4276
23 Qt For Python(PySide2) QML 프로젝트 예제 file makersweb 2019.10.17 5922
22 명령어 한줄로 내컴퓨터를 웹서버로 file 운영자 2019.01.25 4672
21 pydbus 바인딩을 이용하여 서비스 데몬과 D-Bus통신 file makersweb 2018.03.12 3223
» Boost Python을 이용하여 python을 위한 C++ API 바인딩 [5] file makersweb 2017.01.08 10378
19 [Python]EXE또는 DLL파일의 버전정보를 알아내기위한 몇가지 방법 makersweb 2015.06.25 9833
18 QML 및 Window 투명처리 file makersweb 2015.04.22 5109
17 [pyqt4]QTimer 예제 - 버튼을 누르면 3초후 함수 또는 메소드 호출 makersweb 2015.04.01 10760
16 Python + QML with PyQt4 makersweb 2015.03.24 8902
15 print를 로그파일로 생성하기 (log출력 Redirection) makersweb 2015.03.18 6619
14 외부 프로그램 실행 pjk 2015.02.10 16341
13 우분투에 Python새 버전 설치 사용법 pjk 2015.02.10 4169
12 How to Use Freeze pjk 2014.09.06 5751
11 [PyQt4]개발 프로그램 버전표시 메세지 박스 pjk 2014.09.02 8507
10 [PyQt4]여러가지 버튼 예제 file pjk 2014.08.29 15063
9 Python 문자열 관련 함수 레퍼런스 pjk 2014.08.29 7778
8 [PyQt4]스레드 및 ProgressBar 예제 코드 file pjk 2014.08.26 8945
7 [PyQt4]multiprocess 예제 코드 pjk 2014.08.26 8739
6 [PyQt4]마우스 클릭 이벤트 예제 코드 pjk 2014.08.26 7411
5 [PyQt4]폴더 또는 파일을 드레그하여 그 경로를 LineEdit로 가져오기 file pjk 2014.08.22 14319