pybind11로 C++에서 Python 호출하기
pybind11을 사용해 C++ 코드를 Python 모듈로 래핑합니다.
pybind11로 C++에서 Python 호출하기은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
pybind11을 사용하는 이유
pybind11은 최소한의 반복 코드로 C++ 코드의 Python 연동을 만들어 주는 헤더 전용 라이브러리입니다. SciPy, TensorFlow 및 많은 다른 프로젝트에서 사용됩니다.
최소 모듈
PYBIND11_MODULE 매크로를 사용하면 하나의 파일에서 Python 모듈을 정의할 수 있습니다.
#include <pybind11/pybind11.h>
namespace py = pybind11;
int add(int a, int b) { return a + b; }
PYBIND11_MODULE(mymodule, m) {
m.def("add", &add, "Add two integers");
}모듈 빌드하기
Python 확장 모듈로 빌드하며, 보통 CMake 또는 setuptools를 사용합니다.
# CMake
find_package(pybind11 REQUIRED)
pybind11_add_module(mymodule mymodule.cpp)Python에서 사용하기
다른 Python 모듈과 같은 방식으로 가져와 사용합니다.
# Python
import mymodule
print(mymodule.add(2, 3)) # 5클래스 노출하기
py::class_를 사용해 C++ 클래스를 연동합니다. 생성자, 메서드 및 속성은 모두 Python의 대응 요소로 매핑됩니다.
class Point {
public:
Point(int x, int y) : x_(x), y_(y) {}
int x() const { return x_; }
int y() const { return y_; }
private:
int x_, y_;
};
PYBIND11_MODULE(geom, m) {
py::class_<Point>(m, "Point")
.def(py::init<int, int>())
.def("x", &Point::x)
.def("y", &Point::y);
}형 변환
pybind11은 일반적인 유형을 자동으로 변환합니다:
std::string↔ Python 문자열std::vector<T>↔ Python 목록std::map↔ Python 사전- 수치형 ↔ Python 정수/실수
NumPy 상호 운용
NumPy 배열을 py::array_t<T>로 전달합니다. 버퍼에 접근하면 복사 없이 작업할 수 있습니다.
void scale(py::array_t<double> arr, double factor) {
auto buf = arr.mutable_unchecked<1>();
for (size_t i = 0; i < buf.size(); ++i)
buf(i) *= factor;
}연동에 람다 사용하기
인수를 변환하거나 동작을 감싸려면 람다를 직접 연동합니다.
m.def("show", [](const Point& p) {
return "(" + std::to_string(p.x()) + ", " + std::to_string(p.y()) + ")";
});GIL 해제
실행 시간이 긴 C++ 계산에서는 GIL을 해제하여 다른 Python 스레드가 실행될 수 있게 하세요.
m.def("slow", []() {
py::gil_scoped_release release;
// expensive C++ work, no Python access
});성능
pybind11의 추가 오버헤드는 최소 수준이며, 호출당 보통 수백 나노초입니다. 복잡한 함수에서는 무시할 수 있는 수준이지만, 호출 대상 함수가 간단한 촘촘한 반복문에서는 중요할 수 있습니다.
대안
다른 Python-C++ 연동 도구는 다음과 같습니다:
- Boost.Python — 더 오래되었고 무겁습니다
- SWIG — 다양한 언어를 지원합니다
- nanobind — 더 최신이며 pybind11보다 빠릅니다
실제 사용 사례
pybind11은 다음과 같은 경우에 적합합니다:
- Python 사용자를 위해 C++ 라이브러리를 감싸는 경우
- C++ 코드로 Python의 자주 실행되는 경로를 빠르게 만드는 경우
- C++ 애플리케이션과 Python 도구에서 수치 연산 커널을 공유하는 경우
빠른 확인
Python 모듈을 선언할 때 pybind11이 사용하는 매크로는 무엇인가요?
요약
pybind11을 사용하면 C++를 Python용으로 거의 손쉽게 연동할 수 있습니다. PYBIND11_MODULE로 모듈을 선언하고, m.def로 함수를 연동하며, py::class_로 클래스를 연동하세요. 기본 제공 변환이 STL 유형을 처리하며, NumPy 배열은 복사 없이 사용할 수 있습니다.
자주 묻는 질문
“pybind11로 C++에서 Python 호출하기” 강의는 무료인가요?
네 — “pybind11로 C++에서 Python 호출하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“pybind11로 C++에서 Python 호출하기”에서 뭘 배우나요?
pybind11을 사용해 C++ 코드를 Python 모듈로 래핑합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“pybind11로 C++에서 Python 호출하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Extern C와 C ABI
- pybind11로 C++에서 Python 호출하기
- Rust FFI 경계를 위한 C++
- 다중 언어 바인딩에 SWIG 사용하기