반응형

파이썬, ctypes를 이용한 C 프로그램 호출

 

글. 수알치 오상문 

 

1. C 프로그램 작성, myclib.c


#include <stdio.h>

void display() {
    printf("Hello, world!\n");
}

char* display2(char* name, int age) {
    printf("Your name is %s\n", name);
    printf("Your age is %d\n", age);
    return "OK";
}

 

2. C 프로그램을 공유 라이브러리로 빌드 

 

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

 

정상 빌드되면 myclib.so 공유 라이브러리 파일이 생깁니다.

 

3. 파이썬 코드 작성, main.py

 
import platform
import ctypes

# 현재 운영체제 확인

# 한글 인코딩 시 운영체제에 맞게 변환하기 위하여 현재 운영체제를 확인합니다.

current_os = platform.system()

clib = ctypes.CDLL("./myclib.so")  # ctypes.CDLL("/project_python/ctypes_c_call/myclib.so")

clib.display()  #  
clib.display2(b"sangmun", 500)  # 문자열 전달 시 바이트 코드로 전송! 한글은 에러남

if current_os == "Windows":
    clib.display2("상문".encode("ansi"), 500)  # Windows
elif current_os == "Linux":
    clib.display2("상문".encode("utf-8"), 500)  # Linux

cfunc = clib.display2
cfunc.argtypes = [ctypes.c_char_p, ctypes.c_int]  # 함수 전달인수 형
cfunc.restype = ctypes.c_char_p  # 함수 반환 형

ret = cfunc(b"sangmun", 500)
print(f"Return Value is {ret}")

 

4. 파이썬 코드 실행

 

IDLE에서는 메시지가 안 보일 수 있습니다.

콘솔에서 실행합니다.

 

python main.py   <--  또는 python3 main.py

 

[실행 결과]

Hello, world!
Your name is sangmun
Your age is 500
Your name is 상문
Your age is 500
Your name is sangmun
Your age is 500
Return Value is b'OK'

 

반응형

+ Recent posts