조회 수 11754 댓글 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
번호 분류 제목 날짜 조회 수 추천 수
506 C 힙 정렬 Heap Sort file 2005.08.10 38597 0
505 Pi 회로부품 메모 1 secret 2019.08.09 1 0
504 JAVA 현재시간 구하기 2015.10.21 8156 0
503 MFC 현재디렉토리의 파일리스트들을 알아오는 클래스 CFindFile 2008.05.07 62859 0
502 MFC 현재 실행된 어플리케이션의 디렉토리 적용하기 2008.05.07 40410 0
501 일반 프리미어 프로 Premier Pro secret 2022.02.04 0 0
500 MFC 프로젝트 Resource에서 파일로 저장하는 방법 2010.11.01 35034 0
499 LINUX 프로세스를 이름으로 단번에 종료하기 2017.06.07 8968 0
498 MFC 폴더가 존재하는 지 확인하고, 없으면 만드는 함수 2010.02.01 58759 0
497 Pi 포토커플러 Photo Coupler 특징, 종류, 출력, 구조, 동작 원리, 파라미터 2019.01.03 26738 0
496 LINUX 패치 파일 만들기와 적용하기 (patch, diff) 2 2012.10.22 36195 0
495 MFC 파일 읽기 전용 해제 및 설정 2009.09.11 54546 0
494 PHP 파일 데이터 저장하고 불러오기(파일 입출력) 2015.09.30 8806 0
493 Pi 파이썬 코드를 이용한 파이카메라 제어 2018.04.24 10746 0
492 C# 트레이 아이콘 만들기 2013.08.05 13344 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5