본문 바로가기
Python/Python FAQ

Python 파이썬에서 C/C++ 호출하기? [닫힘], Calling C/C++ from Python? [closed]

by 베타코드 2023. 9. 12.
반응형

질문


파이썬 바인딩을 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"가 표시됩니다.
반응형

댓글