본문 바로가기
프로그래밍/리눅스

[swig 간단 예제] python 에서 C 라이브러리 함수 호출

by 앗싸붕 2020. 12. 4.
728x90
반응형

 

SWIG 란

SWIG 는 C나 C++ 과 다른 여러가지 언어들을 간단하게 연결시켜서 사용할 수 있도록 도와주는 언어이다. 즉 C나 C++ 로 만들어진 여러가지 코드들을 Perl, Python, Tcl, Ruby, Java 등에서 사용가능하도록 만들어 준다. 우리가 자주사용하는 스크립트 언어인 Perl, Python 은 매우 강력하지만 몇가지 단점들을 가지고 있다. source 코드가 공개된다는 점과, 실행 속도가 느리다는 점이다. 즉, 속도에 매우 민감한 효율적인 코드를 작성할 필요가 있을때 문제가 될 수 있다.

SWIG 를 이용하면 인터페이스 부분은 매우 빠르고 손쉽게 개발이 가능한 Perl, Python 등으로 개발을 하고 코드를 숨겨야 되거나 혹은 나은 성능을 필요로 하는 핵심 부분은 C 로 작성하도록 해서 서로 연결시키는 것이다. 이렇게 함으로써 개발속도 향상, 효율성, 코드 은닉의 효과를 볼 수 있다.

참고로 SWIG 가 지원하는 언어는 Perl, Python, Java, Guile, Ruby, Php, Tcl 등이 있다.

 

SWIG 를 이용한 C library 와 python 연동

SWIG 를 이용하면 C library 와 python 모듈 간의 연동이 굉장히 간단합니다. 아래 연동하기 위해 시험삼아 만들어본 간단한 예제를 확인해보도록 하겠습니다.

 

SWIG 설치

swig 가 없는 경우에는 하기 명령어로 swig 를 설치합니다.

sudo apt-get install swig

swig 설치

 

C 파일 구현

example.c 파일 생성합니다. 만들고자 하는 코어 로직을 구현해주시면 됩니다. 본 예제에서는 간단하게 현재 시간을 가져오는 함수나머지값을 구하는 함수를 추가했습니다.

#include <stdio.h>
#include <time.h>

double My_var = 3.0;

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

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

example.c

 

Interface 파일 생성

example.c 파일을 위한 interface 파일을 만들어보도록 하겠습니다. 이 파일은 swig 가 C함수를 다른 언어와 연결시키기 위한 정보파일을 만들기 위해서 사용됩니다. 

%module example
%{
extern double My_var;
extern int my_mod(int x, int y);
extern char * get_time();
%}
extern double My_var;
extern int my_mod(int x, int y);
extern char * get_time();

example.i

 

Python 모듈 생성

이제 swig 명령을 이용하여 위에서 생성한 interface 파일로 python 모듈을 생성합니다. example.py 와 example_wrap.c 파일 두 개가 생성되는데 example_wrap.c 는 뒤에 C Library 를 생성할 때 함께 컴파일되어야 합니다.

swig -python example.i

python 모듈 생성

 

C Library 생성

코어 로직이 포함된 example.c 파일과 python 과의 연동을 위한 자동 생성 파일 example_wrap.c 를 컴파일 하고 동적 Library 로 생성해줍니다.

gcc -c example.c example_wrap.c -fPIC -I/usr/include/python3.4m/
ld -shared example.o example_wrap.o -o _example.so

C Library 생성

 

확인용 python 파일 생성

이제 C library 와 python 연동을 위한 준비 과정은 모두 끝났습니다. 확인을 위한 python 파일을 하나 생성해서 제대로 동작하는지 확인해보겠습니다.

import pprint
import example

mod = example.my_mod(7,3)
time = example.get_time()

print mod
print time
pprint.pprint(mod)
pprint.pprint(time)

test.py

실행결과 확인

7%3 의 나머지값인 "1" 과 현재 시간이 정상적으로 출력되는 것을 확인할 수 있습니다.

 

728x90
반응형

댓글