0Pricing
C++ Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Extern C와 C ABI
  2. pybind11로 C++에서 Python 호출하기
  3. Rust FFI 경계를 위한 C++
  4. 다중 언어 바인딩에 SWIG 사용하기
← C++ Academy(으)로 돌아가기