C/C++ 라이브러리와 인터페이싱하기¶
C Foreign Function Interface¶
CFFI 는 CPython과 PyPy 양쪽에서 C와 인터페이싱하기 위한 쉽게 사용할 수 있는 메커니즘을 제공합니다. 두 가지 모드를 지원하는데, 하나는 인라인 ABI 호환 모드(아래 예시 참고)로, 실행 가능 모듈로부터 함수를 동적으로 로드해 실행할 수 있게 해줍니다(본질적으로 LoadLibrary 나 dlopen 과 동일한 기능을 제공합니다). 다른 하나는 API 모드로, C 확장 모듈을 빌드할 수 있게 해줍니다.
ABI 인터랙션¶
1from cffi import FFI
2ffi = FFI()
3ffi.cdef("size_t strlen(const char*);")
4clib = ffi.dlopen(None)
5length = clib.strlen("String to be evaluated.")
6# prints: 23
7print("{}".format(length))
ctypes¶
ctypes 는 CPython에서 C/C++와 인터페이싱하기 위한 사실상의 표준 라이브러리입니다. 주요 운영체제의 네이티브 C 인터페이스(예: Windows의 kernel32, *nix의 libc)에 완전히 접근할 수 있을 뿐만 아니라, 런타임에 DLL이나 공유 객체와 같은 동적 라이브러리를 로드하고 인터페이싱하는 것도 지원합니다. 시스템 API와 상호작용하기 위한 많은 타입을 가져다 주며, struct나 union 같은 복잡한 타입을 직접 정의하거나 필요할 때 패딩과 정렬을 수정하는 일도 비교적 쉽게 할 수 있습니다. 사용하기에 다소 거추장스러울 수 있지만, struct 모듈과 함께 쓰면 데이터 타입이 순수 C/C++ 메소드에서 사용 가능한 형태로 어떻게 변환되는지를 본질적으로 완전히 제어할 수 있습니다.
Struct 대응¶
MyStruct.h
1struct my_struct {
2 int a;
3 int b;
4};
MyStruct.py
1import ctypes
2class my_struct(ctypes.Structure):
3 _fields_ = [("a", c_int),
4 ("b", c_int)]
SWIG¶
SWIG 는 엄밀히 파이썬에 초점을 둔 것은 아니지만(많은 수의 스크립트 언어를 지원합니다), C/C++ 헤더 파일로부터 인터프리트 언어를 위한 바인딩을 생성해주는 도구입니다. 사용법은 매우 간단합니다. 사용자는 인터페이스 파일(튜토리얼과 문서에 자세히 설명됨)을 정의하고, 필요한 C/C++ 헤더를 포함시킨 다음, 빌드 도구를 그것들에 대해 실행하기만 하면 됩니다. 일부 한계가 있긴 하지만(현재 일부 최신 C++ 기능에서 문제가 있는 것으로 보이며, 템플릿이 많은 코드를 동작시키려면 다소 장황해질 수 있습니다), 적은 노력으로 파이썬에 많은 기능을 노출시킬 수 있는 강력한 도구입니다. 또한 SWIG가 생성한 바인딩을 (인터페이스 파일에서) 손쉽게 확장하여 연산자나 내장 메소드를 오버로드하거나, C++ 예외를 파이썬이 잡을 수 있도록 다시 캐스팅하는 등의 작업도 할 수 있습니다.
예시: __repr__ 오버로딩하기¶
MyClass.h
1#include <string>
2class MyClass {
3private:
4 std::string name;
5public:
6 std::string getName();
7};
myclass.i
1%include "string.i"
2
3%module myclass
4%{
5#include <string>
6#include "MyClass.h"
7%}
8
9%extend MyClass {
10 std::string __repr__()
11 {
12 return $self->getName();
13 }
14}
15
16%include "MyClass.h"
Boost.Python¶
Boost.Python 은 C++ 객체의 기능을 노출하기 위해 다소 더 수동적인 작업이 필요하지만, SWIG가 제공하는 모든 기능과 그 이상을 제공할 수 있습니다. 여기에는 C++에서 PyObject에 접근하기 위한 래퍼 제공, SWIG 래퍼 객체 추출, 심지어 C++ 코드에 파이썬 일부를 임베딩하는 것까지 포함됩니다.
