조회 수 11501 댓글 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
번호 분류 제목 날짜 조회 수 추천 수
35 Python Image 기반 Steganography 예제 1 2019.07.17 25137 0
34 Python 디렉토리 없으면 만들기 2019.03.30 5648 0
33 Python 줄 바꿈 없이 출력하는 방법 2019.03.30 6728 0
32 Python Google Colab에서 파일 업로드/다운로드 팁 2019.03.06 36363 0
31 Python pandas, matplot 자주사용하는 코드 2019.03.06 4847 0
30 Python matplot에서 한글이 보이도록 하는 코드 2019.03.06 5972 0
29 Python [tensorflow] 텐서플로우 문서 한글번역본 2018.03.22 5096 0
28 Python [tensorflow] 선형회귀 예제 2018.02.05 5334 0
27 Python json 데이터 핸들링 2017.03.09 8581 0
26 Python pygoogle 파이썬으로 구글 검색결과 가져오기 library 2016.01.20 9825 0
25 Python pyBest 소스 secret 2016.01.20 0 0
24 Python 커맨드 라인에서 컬러로 출력하기 termcolor 2014.06.27 10577 0
23 Python [Sconscript] Install method 2014.05.29 8488 0
» Python C, Python and swig on Windows with Visual Studio 2014.05.29 11501 0
21 Python Python 유용한 코드 모음 2014.05.20 15102 0
목록
Board Pagination ‹ Prev 1 2 3 Next ›
/ 3

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5