조회 수 11643 댓글 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
번호 분류 제목 날짜 조회 수 추천 수
206 LINUX 블루투스 사용하기 hci tool 2017.05.24 11977 0
205 C# 사용자 정의 이벤트(event) 예제 2013.08.08 11909 0
204 C# How to speed adding items to a ListView? 1 2012.12.12 11849 0
203 Pi 아두이노 레오나르도 보드 기본 사용법 2016.11.22 11781 0
202 Python 유용한 Python 함수 및 기능들 2014.04.30 11769 0
201 일반 cmd.exe 쉘 환경변수 추출 및 처리 2014.03.20 11724 0
200 Android SQLite database를 csv로 저장하기, 읽어오기 2015.03.04 11715 0
199 C# DataGridView 컨트롤 Tutorial 2014.02.19 11694 0
» Python C, Python and swig on Windows with Visual Studio 2014.05.29 11643 0
197 LINUX linux 버전 확인하기 2013.03.29 11531 0
196 Android tag 없이 repo sync 후 특정 tag 만 당겨오기 2014.09.18 11479 0
195 C# LDAP Active Directory 계정에서 사진 얻어오기 2013.08.07 11405 0
194 PHP Header for XML content in PHP file 2014.06.02 11377 0
193 Android git 기초 - 원격 저장소 만들고 로그인하기, 소스 되돌리기 2016.10.29 11301 0
192 Android Android studio vmoptions 메모리 설정 2015.02.22 11289 0
목록
Board Pagination ‹ Prev 1 ... 16 17 18 19 20 21 22 23 24 25 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5