조회 수 11741 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
http://blog.naver.com/ez_?Redirect=Log&logNo=140104480727

C/C++ 코드를 Python extension으로 직접 변환하려면 아무래도 손이 많이 가기 마련인데, 직접 하는 대신 swig(http://www.swig.org)를 사용하면 수월하게 작업할 수 있다. 인터넷에 swig를 통해 C/C++코드를 다른 언어로 쓰는 예제(http://www.swig.org/tutorial.html)가 많이 있지만, Windows 플랫폼에서 Visual Studio를 통해 작업하는 방법을 for dummies 수준으로 제시한 문서는 많지 않아, 예제를 따라하는 과정을 한 번 적어보고자 한다.

(1) 준비사항
Visual Studio(C++), swig, python
* swig와 python은 설치한 후에 PATH에 등록하여두면 사용하기에 편리하다.

(2) 예제 파일 작성
아래 파일을 작성하여 example.c로 저장한다.
/* File : example.c */

#include <time.h>
double My_variable = 3.0;

int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
}

int my_mod(int x, int y) {
     return (x%y);
}

char *get_time()
{
     time_t ltime;
     time(&ltime);
     return ctime(&ltime);
}

(3) 인터페이스 파일 작성

swig를 위한 인터페이스 파일을 작성한다.

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}

extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();

원문에서도 나와 있지만, 만약 example.c에 대한 헤더 파일(예:example.h)이 존재한다면, 해당 파일을 이용하여 인터페이스 파일을 보다 간략하게 만들 수 있다.

%module example
%{
/* Includes the header in the wrapper code */
#include "example.h"
%}

/* Parse the header file to generate wrappers */
%include "example.h"


(4) swig를 통해 wrapper와 py파일 생성

커맨드창(cmd)를 통해 아래의 명령을 수행하면 해당 인터페이스에 대응하는 wrapper와 py파일이 생성된다. 파일 이름이 example.c 였다면, example_wrap.c파일과 example.py 파일이 생성된다.

> swig -python example.i


 

(5) Visual Studio로 DLL 생성

python을 직접 빌드할 생각이라면 static library로 만들어, 링크할 때 넣을 수도 있겠지만, dynamic library로 생성하여 import 후 사용하는 것이 일반적이다.

- Visual Studio의 메뉴 File > New > Project를 통해 새로운 프로젝트를 생성하는데, 이때 project type을 Visual C++ > Win32 > Win32 Project > DLL로 생성하도록 한다. 프로젝트 명은 되도록 모듈명과 일치시켜, 혼란이 없도록 하는 것이 좋다.

- 프로젝트가 생성되면 example.c와 example_wrap.c를 프로젝트에 포함시킨다.

- 프로젝트 빌드 타겟을 release로 바꾼다. debug빌드를 위해서는 Python의 debug 라이브러리가 필요한데, binary 배포판에는 포함되어 있지 않기 때문이다.

- 프로젝트 등록정보(properties)의 C/C++ > General > Additional Include Directories에 Python 설치 디렉터리의 include 디렉터리를 지정한다. ( 예: C:\Python26\include )

- Linker > Input > Additional Dependencies에 Python 라이브러리를 지정한다. ( 예: C:\Python26\libs\python.lib )

- 빌드한 후, Release디렉터리 내에 example.dll이 생성된 것을 확인한다.


(6) 모듈로 사용하기

우선, example.dll의 이름을 _example.pyd로 변경한다. 그리고 이 파일과 함께 (4)에서 생성했던 example.py을 Python이 설치된 디렉터리의 Lib\site-packages로 복사한다. 전역으로 사용하지 않을거라면, 두 개 파일을 사용하고자 하는 위치로 복사해야 한다.


Python 쉘을 실행시키고, 아래와 같이 사용해본다.

>>> import example
>>> example.fact(5)
120
>>> example.my_mod(7,3)
1
>>> example.get_time()
'Sun Feb 11 23:01:07 1996'
>>>


Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
251 Pi [Arduino] Timer 라이브러리 사용하기 2016.10.25 14292 0
250 Python collections.counter() 함수 2014.04.30 14225 0
249 Pi NPN과 PNP 트랜지스터의 차이 2019.01.03 14219 0
248 Android adb로 폰 화면 동영상 저장 - KK 전용 2013.12.17 14177 0
247 개념 AC3, Dolby Digital file 2012.11.14 14169 0
246 개념 스트리밍 개요 Streaming overview 2012.11.26 14125 0
245 Android Perl 정리 요약 2013.08.13 14120 0
244 LINUX bluetooth on Ubuntu 2017.05.25 13751 0
243 LINUX vi 필수 명령어 2012.04.27 13727 0
242 LINUX [Shell Script] Bash 실행결과를 변수에 담기 2017.05.16 13656 0
241 일반 net use와 subst file 2012.12.18 13548 0
240 Android ADB Usage 번역 2013.07.10 13434 0
239 Android How to create OMA DRM v1.0 content 2012.05.24 13405 0
238 LINUX 접속한 사용자 확인 w 명령어 2013.05.02 13372 0
237 C++ C++ string 정리 (C++ 문자열) 2017.02.14 13368 0
목록
Board Pagination ‹ Prev 1 ... 13 14 15 16 17 18 19 20 21 22 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5