파이썬 - 추가 확장: 초보자 가이드
안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 오늘, 우리는 파이썬 확장의 세계로 흥미로운 여정을 떠날 거예요. 프로그래밍에 새로운 여러분이라도 걱정 마세요 - 여러분의 친절한 가이드로서 저는 모든 것을 단계별로 설명해 드릴 거예요. 그럼, 몸을 던지자!
파이썬 확장이란?
시작하기 전에, 파이썬 확장이란 무엇인지 이해해 보겠습니다. 파이썬을 스위스 아rmy 톱라이스라고 상상해 보세요. 이미 매우 유용하지만, 때로는 그곳에 없는 도구가 필요할 때가 있죠. 그럴 때 확장이 들어옵니다 - 이는 파이썬 스위스 아rmy 톱에 새로운 도구를 추가하는 것과 같아요.
확장을 작성하기 위한 사전 조건
이제, 여러분이 서둘러 시작하려고 하지만, 우리는 먼저 몇 가지를 설정해야 합니다. 이는 고메반을 만들기 전에 주방을 준비하는 것과 같아요. 여러분이 필요한 것들은 다음과 같습니다:
- 컴퓨터에 설치된 파이썬
- C 컴파일러 (리눅스의 GCC 또는 윈도우의 Visual Studio)
- 파이썬 개발 헤더와 라이브러리
이听起来 복잡하지만 걱정 마세요. 대부분의 파이썬 설치에는 필요한 것들이 포함되어 있으며, 추가 설정에 대해서도 저가 안내해 드릴 거예요.
파이썬 확장의 첫 봄
간단한 예제로 시작해 보겠습니다. 두 개의 숫자를 더하는 함수를 만들고 싶지만, 매우 빠르게 하고 싶은 경우를 상상해 보세요. 우리는 이를 C로 작성하고 파이썬에서 사용할 수 있습니다. 이렇게 보일 수 있습니다:
#include <Python.h>
static PyObject* add_numbers(PyObject* self, PyObject* args) {
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}
static PyMethodDef MyMethods[] = {
{"add", add_numbers, METH_VARARGS, "두 개의 숫자를 더합니다."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef mymodule = {
PyModuleDef_HEAD_INIT,
"mymodule",
"숫자를 더하는 간단한 모듈",
-1,
MyMethods
};
PyMODINIT_FUNC PyInit_mymodule(void) {
return PyModule_Create(&mymodule);
}
이제는 알파벳 스ープ 같아 보일 수 있지만, 걱정 마세요. 저희는 조각을 하나씩 분석해 나갈 거예요.
헤더 파일 Python.h
우리 코드의 첫 줄은 다음과 같습니다:
#include <Python.h>
이는 우리의 C 프로그램에 "여기서 파이썬과 함께 일하겠다!"라고 말하는 것과 같습니다. 이는 파이썬 확장을 만들기 위해 필요한 모든 정의와 함수를 포함합니다.
C 함수들
다음으로, 우리의 실제 C 함수를 볼 수 있습니다:
static PyObject* add_numbers(PyObject* self, PyObject* args) {
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}
이 함수는 두 개의 파이썬 객체를 입력으로 받고, 그 안에서 두 개의 정수를 추출하여 더한 다음, 결과를 파이썬 객체로 반환합니다. 이는 C와 파이썬 간의 번역자와 같습니다.
메서드 매핑 테이블
static PyMethodDef MyMethods[] = {
{"add", add_numbers, METH_VARARGS, "두 개의 숫자를 더합니다."},
{NULL, NULL, 0, NULL}
};
이 테이블은 우리의 파이썬 모듈의 메뉴와 같습니다. 이는 파이썬에 "이 모듈에는 다음 기능이 있습니다"라고 알려줍니다. 이 경우, 우리는 "add"라는 하나의 기능을 제공합니다.
초기화 함수
PyMODINIT_FUNC PyInit_mymodule(void) {
return PyModule_Create(&mymodule);
}
이 함수는 파이썬이 우리의 모듈을 임포트할 때 호출됩니다. 이는 새 상점의 개업식과 같이 - 모든 것을 설정하고 모듈을 사용할 준비를 합니다.
확장을 빌드하고 설치하기
이제 우리는 확장을 작성했으니, 이를 빌드해야 합니다. 이 과정은 우리의 C 코드를 파이썬이 사용할 수 있는 것으로 변환합니다. 이는 케이크를 굽는 것과 같아요 - 우리는 재료를 섞었으니, 이제 오븐에 넣어야 해요.
보통 setup.py
파일을 사용합니다:
from distutils.core import setup, Extension
module = Extension('mymodule', sources = ['mymodule.c'])
setup(name = 'MyModule',
version = '1.0',
description = '이것은 데모 패키지입니다',
ext_modules = [module])
확장을 빌드하려면 다음을 실행합니다:
python setup.py build
확장 임포트하기
빌드된 후, 여러분은 다른 파이썬 모듈처럼 새로운 모듈을 사용할 수 있습니다:
import mymodule
result = mymodule.add(5, 3)
print(result) # 출력: 8
멋지지 않나요? 여러분은 파이썬에서 C 함수를 사용했습니다!
함수 파라미터 전달하기
여러분이 파이썬에서 C로 파라미터를 어떻게 전달하는지 좀 더 이야기해 보겠습니다. 이 줄을 기억하나요?
if (!PyArg_ParseTuple(args, "ii", &a, &b))
PyArg_ParseTuple 함수
이 함수는 파라미터가 파이썬에서 C 함수로 전달되는 방식을 이해하는 키입니다. 이는 귀국심사소로, 파이썬에서 온 모든 것을 점검하고 처리하는 것과 같습니다.
함수에서 "ii"는 두 개의 정수를 기대한다는 의미입니다. 문자열과 플로트를 전달하려면 "sf"를 사용합니다. 다음은 유용한 포맷 지정자 표입니다:
포맷 지정자 | 파이썬 타입 | C 타입 |
---|---|---|
i | int | int |
l | long | long |
f | float | float |
d | float | double |
s | str | char* |
O | 모든 객체 | PyObject* |
값 반환하기
들어오는 데이터를 주의 깊게 처리할 것만큼, 우리는 반환 값을 올바르게 패키징해야 합니다.
Py_BuildValue 함수
이 함수는 우리의 C 값에게 선물包装자와 같이, 파이썬이 받을 수 있게 예쁘게 해줍니다. 이렇게 작동합니다:
return Py_BuildValue("i", a + b);
"i"는 Py_BuildValue가 정수 객체를 만들도록 지시합니다. 문자열을 반환하려면 "s"를 사용합니다.
그리고 그게 다예요! 여러분은 파이썬 확장의 세계로 첫 걸음을 내딛었어요. 연습이 법이라는 말을 기억하세요. 여러분만의 간단한 확장을 써보고, 다양한 데이터 타입을 놀래보며, 가장 중요한 것은 즐기세요!
파이썬 확장은 새로운 가능성의 세계를 열어줍니다. 여러분은 중요한 코드 부분을 최적화하거나 기존의 C 라이브러리와 인터페이스할 수 있습니다. 이는 여러분의 프로그래밍 도구킥에 강력한 도구입니다.
코드를 즐겁게, 다음 번에 뵙기 전까지 계속 탐험하고 배우세요!
Credits: Image by storyset