반응형
질문
파이썬
바인딩을 C
또는 C++
라이브러리에 가장 빠르게 구축하는 방법은 무엇인가요?
(이것이 중요한 사항이라면, 저는 Windows
를 사용하고 있습니다.)
답변
ctypes 모듈은 표준 라이브러리의 일부이므로 swig보다 안정적이고 널리 사용할 수 있습니다. swig은 항상 문제를 일으키는 경향이 있었습니다.
ctypes를 사용하면 python에 대한 컴파일 타임 종속성을 충족해야하며, 바인딩은 컴파일된 python뿐만 아니라 ctypes를 가진 모든 python에서 작동합니다.
간단한 C++ 예제 클래스를 foo.cpp라는 파일에서 작업하려는 경우를 가정해보겠습니다.
#include <iostream>
class Foo{
public:
void bar(){
std::cout << "Hello" << std::endl;
}
};
ctypes는 C 함수만 사용할 수 있으므로, extern "C"로 선언하여 제공해야합니다.
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}
다음으로 이것을 공유 라이브러리로 컴파일해야합니다.
g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o
마지막으로 python 래퍼를 작성해야합니다 (예: fooWrapper.py에서)
from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self):
lib.Foo_bar(self.obj)
이제 이렇게 호출할 수 있습니다.
f = Foo()
f.bar() #화면에 "Hello"가 표시됩니다.
반응형
댓글