본문 바로가기

👩‍💻 도비는 공부중/💼 하계연구연수생(2023)

[Python] C 함수 호출을 위한 Wrapper 만들기

'.so' file은 유닉스 계열 운영체제에서 사용되는 공유 라이브러리 파일이다.

C/C++로 작성된 소스코드를 컴파일하여 생성한다. 


C 소스코드 작성

# 'mylib.c'
int add (int a, int b) {
	return a + b;
}

적절한 기능을 가진 C 소스 코드를 작성한다.

 

 

컴파일 명령 실행

gcc -shared -o mylib.so -fPIC mylib.c

-shared: 공유 라이브러리를 생성

-o: 출력 파일의 이름 지정

-fPIC: 위치 독립 코드(Position Independent Code) 생성

 

 

.so 파일 생성 확인

 

현재 디렉토리에 'myjlib.so' 파일이 생성되었는지 확인

'.so' 파일은 C/C++로 작성된 기능을 Python 등 다른 프로그래밍 언어에서 사용할 수 있는 형태로 제공한다.

 


Python Wrapper

import ctypes

# ```
# ctypes 모듈 사용해 c함수 호출하는 wrapper
# ```

path = './mylib.so'

# add 함수 signiture 정의
lib = ctypes.CDLL(path) # CDLL: C 라이브러리 로드
lib.add.argtypes = (ctypes.c_int, ctypes.c_int) # argypes: c 함수의 인자 타입 정의
lib.add.restype = ctypes.c_int  # restype: c 함수의 반환 타입 정의

# C 함수 호출
result = lib.add(2, 3)  # c 함수 반환 후 결과 출력
print(result)

+ Windows

 

1. Set up

 

add.dll

add_wrapper.py

 

 

2. Implementation

 

2.1 Import

from ctypes import *
from sys import platform

 

2.2 Load library

shared_lib_path = "./add.so"
if platform.startswith('win32'):
    shared_lib_path = "./add.dll"
try:
    add_lib = CDLL(shared_lib_path)
    print("Successfully loaded ", add_lib)
except Exception as e:
    print(e)

 


더 알아보기..

- pybind 11