파이썬에서 C / C ++를 호출 하시겠습니까?


521

C 또는 C ++ 라이브러리에 파이썬 바인딩을 구성하는 가장 빠른 방법은 무엇입니까?

(중요한 경우 Windows를 사용하고 있습니다.)

답변:


170

Boost.Python을 살펴 봐야 합니다. 다음은 웹 사이트에서 가져온 짧은 소개입니다.

Boost Python Library는 Python과 C ++를 인터페이스하기위한 프레임 워크입니다. C ++ 컴파일러만으로도 특별한 도구를 사용하지 않고도 C ++ 클래스 함수와 객체를 파이썬에 빠르고 완벽하게 노출시킬 수 있습니다. C ++ 인터페이스를 방해하지 않고 감싸도록 설계되었으므로 C ++ 코드를 변경하기 위해 전혀 변경하지 않아도되므로 Boost.Python은 타사 라이브러리를 Python에 노출시키는 데 이상적입니다. 라이브러리에서 고급 메타 프로그래밍 기술을 사용하면 사용자의 구문이 단순 해져 래핑 코드가 일종의 선언적 인터페이스 정의 언어 (IDL)를 살펴볼 수 있습니다.


Boost.Python은 Boost에서 사용자에게 친숙한 라이브러리 중 하나입니다. 간단한 함수 호출 API는 매우 간단하며 직접 작성해야하는 상용구를 제공합니다. 객체 지향 API를 노출하려면 조금 더 복잡합니다.
jwfearn

15
Boost.Python은 상상할 수있는 최악의 것입니다. 모든 새 컴퓨터와 업그레이드마다 연결 문제가 발생합니다.
miller

14
거의 11 년 후이 답변의 품질에 대한 몇 가지 생각이 있습니까?
J Evans

4
이것은 여전히 ​​python과 c ++ 인터페이스에 가장 적합한 방법입니까?
tushaR

8
어쩌면 부스트에 비해 가벼운 pybind11 을 사용해 볼 수 있습니다 .
jdhao

659

ctypes 모듈은 표준 라이브러리의 일부이므로 swig 보다 안정적이고 널리 사용 가능하므로 항상 문제가 발생 합니다.

ctypes를 사용하면 파이썬에 대한 컴파일 시간 종속성을 충족시켜야하며 바인딩은 ctypes가있는 모든 파이썬에서 컴파일됩니다.

foo.cpp라는 파일에서 대화하려는 간단한 C ++ 예제 클래스가 있다고 가정하십시오.

#include <iostream>

class Foo{
    public:
        void bar(){
            std::cout << "Hello" << std::endl;
        }
};

ctype은 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

그리고 마지막으로 파이썬 래퍼를 작성해야합니다 (예 : 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() #and you will see "Hello" on the screen

14
이것은 단일 함수 호출에서 boost.python이 당신을 위해하는 일과 거의 같습니다.
Martin Beckett

203
ctypes는 python 표준 라이브러리에 있으며 swig 및 boost는 없습니다. Swig and Boost는 확장 모듈에 의존하므로 무관 한 공유 객체가 아닌 Python 부 버전에 연결됩니다. 나뭇 가지 또는 부스트 래퍼를 만드는 것은 어려울 수 있으며 ctypes는 빌드 요구 사항이 없습니다.
Florian Bösch

25
boost는 부두 템플릿 마법과 완전히 맞춤형 빌드 시스템에 의존하고 ctypes는 단순성에 의존합니다. ctypes는 동적이며 boost는 정적입니다. ctypes는 다른 버전의 라이브러리를 처리 할 수 ​​있습니다. 부스트 수 없습니다.
Florian Bösch

32
Windows에서는 Python에서 함수 서명을 볼 수 있도록 __declspec (dllexport)을 지정해야했습니다. 위의 예에서 이것은 다음에 해당합니다. extern "C" { __declspec(dllexport) Foo* Foo_new(){ return new Foo(); } __declspec(dllexport) void Foo_bar(Foo* foo){ foo->bar(); } }
Alan Macdonald

13
Foo_delete함수를 제공 하고 파이썬 소멸자에서 호출하거나 객체를 자원 에 래핑하여 포인터를 삭제하는 것을 잊지 마십시오 .
Adversus

58

가장 빠른 방법은 SWIG를 사용하는 것 입니다.

SWIG 튜토리얼의 예 :

/* File : example.c */
int fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}

인터페이스 파일 :

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern int fact(int n);
%}

extern int fact(int n);

유닉스에서 파이썬 모듈 만들기 :

swig -python example.i
gcc -fPIC -c example.c example_wrap.c -I/usr/local/include/python2.7
gcc -shared example.o example_wrap.o -o _example.so

용법:

>>> import example
>>> example.fact(5)
120

python-dev가 있어야합니다. 또한 일부 시스템에서 파이썬 헤더 파일은 설치 방법에 따라 /usr/include/python2.7에 있습니다.

튜토리얼에서 :

SWIG는 거의 모든 언어 기능을 지원하는 상당히 완전한 C ++ 컴파일러입니다. 여기에는 전처리, 포인터, 클래스, 상속 및 C ++ 템플릿이 포함됩니다. SWIG를 사용하여 구조와 클래스를 대상 언어의 프록시 클래스로 패키지하여 기본 기능을 매우 자연스럽게 노출 할 수 있습니다.


50

높은 수준의 데이터 유형 (파이썬 목록과 다차원 STL 벡터)을 연결하기 위해이 페이지에서 Python <-> C ++ 바인딩으로 여행을 시작했습니다. :-)

ctypesboost.python (및 소프트웨어 엔지니어 아님)을 기반으로 솔루션을 시도한 결과 높은 수준의 데이터 유형 바인딩이 필요할 때 복잡하다는 것을 알았습니다 .SWIG 을 찾았습니다. 는 이러한 경우에 훨씬 더 간단 .

따라서이 예에서는 SWIG를 사용하며 Linux에서 테스트되었지만 SWIG를 사용할 수 있으며 Windows에서도 널리 사용됩니다.

목표는 2D STL 벡터 형태의 행렬을 가져와 각 행의 평균을 1D STL 벡터로 반환하는 Python에서 C ++ 함수를 사용할 수있게하는 것입니다.

C ++ 코드 ( "code.cpp")는 다음과 같습니다.

#include <vector>
#include "code.h"

using namespace std;

vector<double> average (vector< vector<double> > i_matrix) {

  // Compute average of each row..
  vector <double> averages;
  for (int r = 0; r < i_matrix.size(); r++){
    double rsum = 0.0;
    double ncols= i_matrix[r].size();
    for (int c = 0; c< i_matrix[r].size(); c++){
      rsum += i_matrix[r][c];
    }
    averages.push_back(rsum/ncols);
  }
  return averages;
}

동등한 헤더 ( "code.h")는 다음과 같습니다.

#ifndef _code
#define _code

#include <vector>

std::vector<double> average (std::vector< std::vector<double> > i_matrix);

#endif

먼저 C ++ 코드를 컴파일하여 객체 파일을 만듭니다.

g++ -c -fPIC code.cpp

그런 다음 C ++ 함수에 대한 SWIG 인터페이스 정의 파일 ( "code.i")을 정의합니다 .

%module code
%{
#include "code.h"
%}
%include "std_vector.i"
namespace std {

  /* On a side note, the names VecDouble and VecVecdouble can be changed, but the order of first the inner vector matters! */
  %template(VecDouble) vector<double>;
  %template(VecVecdouble) vector< vector<double> >;
}

%include "code.h"

SWIG를 사용하여 SWIG 인터페이스 정의 파일에서 C ++ 인터페이스 소스 코드를 생성합니다.

swig -c++ -python code.i

마지막으로 생성 된 C ++ 인터페이스 소스 파일을 컴파일하고 모든 것을 연결하여 Python에서 직접 가져올 수있는 공유 라이브러리 ( "_")를 생성합니다.

g++ -c -fPIC code_wrap.cxx  -I/usr/include/python2.7 -I/usr/lib/python2.7
g++ -shared -Wl,-soname,_code.so -o _code.so code.o code_wrap.o

이제 파이썬 스크립트에서 함수를 사용할 수 있습니다 :

#!/usr/bin/env python

import code
a= [[3,5,7],[8,10,12]]
print a
b = code.average(a)
print "Assignment done"
print a
print b

C ++ 코드에서 stl 벡터가 비 const 참조로 전달되어 파이썬에서 출력 매개 변수로 사용할 수있는 실제 사례 구현 : lobianco.org/antonello/personal:portfolio:portopt
Antonello

33

또한 pybind11가벼운 버전의 Boost.Python 과 유사하며 모든 최신 C ++ 컴파일러와 호환됩니다.

https://pybind11.readthedocs.io/en/latest/


1
오늘 !! 2020 이것이 최고의 답변이되어야합니다! 템플릿 헤더 전용 라이브러리입니다. Pytorch pytorch.org/tutorials/advanced/cpp_extension.html 과 같은 많은 관련 프로젝트가 권장 합니다. VS CommunityWindows 에서도 완벽하게 작동합니다.
eusoubrasileiro

30

pyrex 또는 Cython을 확인하십시오 . C / C ++와 Python 간의 인터페이스를위한 Python과 유사한 언어입니다.


1
Cython +1! 나는 cffi를 시도하지 않았으므로 어느 것이 더 낫다고 말할 수는 없지만 Cython에 대해 매우 좋은 경험을했습니다. 여전히 Python 코드를 작성하고 있지만 C를 사용할 수 있습니다. Cython으로 빌드 프로세스를 설정하는 것은 다소 어려웠습니다. 나중에 블로그 게시물에서 설명했습니다 : martinsosic.com/development/2016/02/08/…
Martinsos

더 이상 링크 전용 답변이되지 않도록 답변을 개선 할 수 있습니다.
Adelin

나는 약 일주일 동안 Cython을 사용해 왔으며 많이 좋아합니다 .1) 사용중인 ctypes를 보았고 많은 함정으로 추악하고 오류가 발생하기 쉽습니다 .2) 파이썬 코드를 가져 와서 속도를 높일 수 있습니다 정적으로 타이핑하는 것만으로 3) C / C ++ 메소드와 객체를위한 Python 래퍼를 작성하는 것은 간단합니다. 4) 여전히 잘 지원됩니다. 그것은 venvs와 cross-compiling에 대한 vis-a-vis 설치에 대한 더 많은 지침과 관련이있을 수 있습니다. 아주 좋은 4 시간의 비디오 자습서는 여기에 있습니다 : youtube.com/watch?v=gMvkiQ-gOW8
덴 - 제이슨

22

최신 C ++의 경우 cppyy를 사용하십시오. http://cppyy.readthedocs.io/en/latest/

Clang / LLVM의 C ++ 인터프리터 인 Cling을 기반으로합니다. 바인딩은 런타임에 있으며 추가 중간 언어가 필요하지 않습니다. Clang 덕분에 C ++ 17을 지원합니다.

pip를 사용하여 설치하십시오.

    $ pip install cppyy

소규모 프로젝트의 경우 관련 라이브러리와 관심있는 헤더를로드하기 만하면됩니다. 예를 들어 ctypes 예제의 코드는이 스레드이지만 헤더와 코드 섹션으로 나뉩니다.

    $ cat foo.h
    class Foo {
    public:
        void bar();
    };

    $ cat foo.cpp
    #include "foo.h"
    #include <iostream>

    void Foo::bar() { std::cout << "Hello" << std::endl; }

그것을 컴파일하십시오 :

    $ g++ -c -fPIC foo.cpp -o foo.o
    $ g++ -shared -Wl,-soname,libfoo.so -o libfoo.so  foo.o

그것을 사용하십시오 :

    $ python
    >>> import cppyy
    >>> cppyy.include("foo.h")
    >>> cppyy.load_library("foo")
    >>> from cppyy.gbl import Foo
    >>> f = Foo()
    >>> f.bar()
    Hello
    >>>

준비된 리플렉션 정보 및 cmake 프래그먼트를 자동으로로드하여 대규모 프로젝트가 지원되므로이를 통해 설치된 패키지 사용자가 간단하게 실행할 수 있습니다.

    $ python
    >>> import cppyy
    >>> f = cppyy.gbl.Foo()
    >>> f.bar()
    Hello
    >>>

LLVM 덕분에 자동 템플릿 인스턴스화와 같은 고급 기능이 가능합니다. 예제를 계속하려면 :

    >>> v = cppyy.gbl.std.vector[cppyy.gbl.Foo]()
    >>> v.push_back(f)
    >>> len(v)
    1
    >>> v[0].bar()
    Hello
    >>>

참고 : 저는 cppyy의 저자입니다.


3
실제로는 아닙니다. Cython은 Python 용 C 확장 모듈을 작성하는 Python과 유사한 프로그래밍 언어입니다 (Cython 코드는 필요한 C-API 상용구와 함께 C로 변환됩니다). 기본적인 C ++ 지원을 제공합니다. cppyy를 사용한 프로그래밍은 언어 확장이 아닌 Python 및 C ++ 만 포함합니다. 그것은 완전히 런타임이며 오프라인 코드를 생성하지 않습니다 (게으른 생성은 훨씬 더 좋습니다). 최신 C ++ (자동 템플릿 인스턴스화, 이동, 이니셜 라이저 목록, 람다 등 포함)을 대상으로하며 PyPy는 기본적으로 지원됩니다 (예 : 느린 C-API 에뮬레이션 레이어를 통하지 않음).
Wim Lavrijsen

2
PyHPC'16 논문 에는 다양한 벤치 마크 수치가 포함되어 있습니다. 그 이후로 CPython 측면에서 명확한 개선이 이루어졌습니다.
Wim Lavrijsen 2016 년

당신이 추가 통합 작업을 할 필요가 없기 때문에 나는이 방법을 좋아한다 swig, ctypes또는 boost.python. 파이썬이 C ++ 코드와 작동하도록 코드를 작성하는 대신 파이썬은 C ++을 알아 내기 위해 열심히 노력합니다. 실제로 작동한다고 가정합니다.
Trevor Boyd Smith

cppyy는 매우 흥미 롭습니다! 문서에서 재배포 및 사전 패키지가 처리된다는 것을 알았습니다. 파이썬 코드를 패키지화하는 도구 (예 : PyInstaller)에서도 잘 작동하는 것으로 알려져 있습니까? 그리고 이것은 루트 프로젝트와 관련이 있습니까, 아니면 그 작업을 활용합니까?
JimB

감사! PyInstaller에 익숙하지 않지만, 선언, 경로 및 헤더를 패키지화하는 "사전"은 공유 라이브러리로 컴파일 된 C ++ 코드입니다. cppyy가 C ++ 코드를 바인딩하는 데 사용되므로 더 많은 C ++ 코드를 처리하는 것이 좋습니다. 그리고이 코드는 Python C-API (libcppyy 모듈 만 해당)에 의존하지 않으므로 작업이 간소화됩니다. cppyy 자체는 conda-forge 또는 pypi (pip)에서 설치할 수 있으므로 해당 환경이 제대로 작동합니다. 예, cppyy는 PyROOT의 포크로 시작했지만 그 이후로 ROOT 팀은 PyROOT를 cppyy 위에 올려 놓았습니다.
Wim Lavrijsen


15

나는 그것을 사용한 적이 없지만 ctypes에 대해 좋은 것을 들었습니다 . C ++에서 사용하려는 경우를 통해 name mangling을 피하십시오 extern "C". 의견을 주셔서 감사합니다. Florian Bösch.


13

나는 파이썬의 cffi가 옵션 일 수 있다고 생각합니다.

목표는 Python에서 C 코드를 호출하는 것입니다. 당신은 제 3 언어를 배우지 않고도 그렇게 할 수 있어야합니다. 모든 대안은 자신의 언어 (Cython, SWIG) 또는 API (ctypes)를 배워야합니다. 그래서 우리는 파이썬과 C를 알고 있다고 가정하고 배우는 데 필요한 추가 비트를 최소화하려고 시도했습니다.

http://cffi.readthedocs.org/en/release-0.7/


2
나는 이것이 c 만 호출 할 수 있다고 생각하지만, 여전히 +1 (나는 정말로 cffi를 좋아한다).
Andy Hayden

8

문제는 올바르게 이해하면 Python에서 C 함수를 호출하는 방법입니다. 그렇다면 가장 좋은 방법은 Ctypes입니다 (파이썬의 모든 변형에서 BTW 이식 가능).

>>> from ctypes import *
>>> libc = cdll.msvcrt
>>> print libc.time(None)
1438069008
>>> printf = libc.printf
>>> printf("Hello, %s\n", "World!")
Hello, World!
14
>>> printf("%d bottles of beer\n", 42)
42 bottles of beer
19

자세한 가이드는 내 블로그 기사 를 참조 하십시오 .


ctypes는 이식 가능하지만 코드에는 Windows 특정 C 라이브러리가 필요하다는 점에 주목할 가치가 있습니다.
Palec


6

Java 래퍼를 작성할 것으로 예상되지 않는 한 Cython이 확실한 방법입니다.이 경우 SWIG가 바람직 할 수 있습니다.

runcython커맨드 라인 유틸리티를 사용하는 것이 좋습니다 . Cython을 사용하는 프로세스가 매우 쉽습니다. 구조화 된 데이터를 C ++로 전달해야하는 경우 Google의 프로토 타입 라이브러리를 살펴보면 매우 편리합니다.

다음은 두 도구를 모두 사용하는 최소한의 예입니다.

https://github.com/nicodjimenez/python2cpp

그것이 유용한 출발점이 될 수 있기를 바랍니다.


5

먼저 특정 목적이 무엇인지 결정해야합니다. 파이썬 인터프리터 확장 및 임베드 에 대한 공식 파이썬 문서 는 위에서 언급 했으므로 바이너리 확장에 대한 좋은 개요를 추가 할 수 있습니다 . 사용 사례는 3 가지 범주로 나눌 수 있습니다.

  • 가속기 모듈 : CPython에서 실행되는 동등한 순수 Python 코드보다 빠르게 실행합니다.
  • 래퍼 모듈 : 기존 C 인터페이스를 Python 코드에 노출합니다.
  • 낮은 수준의 시스템 액세스 : CPython 런타임, 운영 체제 또는 기본 하드웨어의 낮은 수준의 기능에 액세스합니다.

다른 관심사에 대한 더 넓은 관점을 제공하고 초기 질문이 약간 모호하기 때문에 ( "C 또는 C ++ 라이브러리에 대한")이 정보가 흥미로울 것입니다. 위의 링크에서 바이너리 확장과 그 대안을 사용할 때의 단점에 대해 읽을 수 있습니다.

제안 된 다른 답변 외에도 가속기 모듈을 원한다면 Numba 을 사용해보십시오 . "가져 오기 시간, 런타임 또는 정적으로 (포함 된 pycc 도구를 사용하여) LLVM 컴파일러 인프라를 사용하여 최적화 된 기계 코드를 생성하여 작동합니다."


3

저는 cppyy를 좋아합니다. C ++ 코드로 Python을 확장하는 것이 매우 쉬워 져 필요할 때 성능이 크게 향상됩니다.

강력하고 솔직하게 사용하기가 간단합니다.

다음은 numpy 배열을 만들어 C ++의 클래스 멤버 함수에 전달하는 방법의 예입니다.

cppyy_test.py

import cppyy
import numpy as np
cppyy.include('Buffer.h')


s = cppyy.gbl.Buffer()
numpy_array = np.empty(32000, np.float64)
s.get_numpy_array(numpy_array.data, numpy_array.size)
print(numpy_array[:20])

Buffer.h

struct Buffer {
  void get_numpy_array(double *ad, int size) {
    for( long i=0; i < size; i++)
        ad[i]=i;
  }
};

CMake를 사용하여 Python 모듈을 매우 쉽게 만들 수도 있습니다. 이렇게하면 C ++ 코드를 항상 다시 컴파일하지 않아도됩니다.


2

pybind11 최소 실행 가능 예

pybind11은 이전에 https://stackoverflow.com/a/38542539/895245 에서 언급 되었지만 여기에 구체적인 사용 예와 구현에 대한 추가 논의가 필요합니다.

pybind11은 정말 사용하기 쉽기 때문에 pybind11을 강력히 권장합니다. 헤더를 포함하면 pybind11은 템플릿 매직을 사용하여 Python에 노출하려는 C ++ 클래스를 검사하고 투명하게 수행합니다.

이 템플릿 마술의 단점은 pybind11을 사용하는 파일에 몇 초를 즉시 추가하여 컴파일 속도를 늦추는 것입니다. 예를 들어이 문제에 대한 조사를 참조하십시오 . PyTorch가 동의합니다 .

다음은 pybind11이 얼마나 멋진 지 보여주는 최소한의 실행 가능한 예입니다.

class_test.cpp

#include <string>

#include <pybind11/pybind11.h>

struct ClassTest {
    ClassTest(const std::string &name) : name(name) { }
    void setName(const std::string &name_) { name = name_; }
    const std::string &getName() const { return name; }
    std::string name;
};

namespace py = pybind11;

PYBIND11_PLUGIN(class_test) {
    py::module m("my_module", "pybind11 example plugin");
    py::class_<ClassTest>(m, "ClassTest")
        .def(py::init<const std::string &>())
        .def("setName", &ClassTest::setName)
        .def("getName", &ClassTest::getName)
        .def_readwrite("name", &ClassTest::name);
    return m.ptr();
}

class_test_main.py

#!/usr/bin/env python3

import class_test

my_class_test = class_test.ClassTest("abc");
print(my_class_test.getName())
my_class_test.setName("012")
print(my_class_test.getName())
assert(my_class_test.getName() == my_class_test.name)

컴파일하고 실행하십시오.

#!/usr/bin/env bash
set -eux
g++ `python3-config --cflags` -shared -std=c++11 -fPIC class_test.cpp \
  -o class_test`python3-config --extension-suffix` `python3-config --libs`
./class_test_main.py

이 예제에서는 pybind11을 사용하여 ClassTestC ++ 클래스를 Python 에 손쉽게 노출 할 수있는 방법을 보여줍니다 . 컴파일은 파일 이름 class_test.cpython-36m-x86_64-linux-gnu.soclass_test_main.py자동으로 정의 하는 파일을 생성 합니다.class_test 기본적으로 정의 된 모듈 합니다.

아마도 네이티브 Python API를 사용하여 동일한 작업을 수행하려고 시도하는 경우에만 이것이 얼마나 멋진 지 깨달을 것입니다. 예를 들어이 작업을 수행하는이 예제를 참조하십시오. /cirosantilli/python-cheat/blob/4f676f62e87810582ad53b2fb426b74eae52aad5/py_from_c/pure.c 이 예에서 C 코드가 포함 된 모든 정보 (멤버, 메소드, 추가로 비트 단위로 고통스럽고 명시 적으로 Python 클래스를 정의하는 방법을 볼 수 있음) 메타 데이터 ...). 또한보십시오:

pybind11 Boost.Pythonhttps://stackoverflow.com/a/145436/895245 에서 언급 한 것과 비슷 하지만 Boost 프로젝트 내부의 부풀림에서 벗어나기 때문에 더 최소라고 주장합니다.

pybind11은 주로 기존 C ++ 코드의 Python 바인딩을 만들기 위해 Python에서 C ++ 유형을 노출하거나 그 반대로 노출시키는 경량 헤더 전용 라이브러리입니다. 그것의 목표와 구문은 David Abrahams의 우수한 Boost.Python 라이브러리와 비슷합니다.

Boost.Python의 주요 문제 및 이와 유사한 프로젝트를 만드는 이유는 Boost입니다. Boost는 존재하는 거의 모든 C ++ 컴파일러와 작동하는 매우 크고 복잡한 유틸리티 라이브러리입니다. 이 호환성에는 비용이 있습니다. 가장 오래되고 버그가 많은 컴파일러 시편을 지원하려면 비전형 템플릿 트릭과 해결 방법이 필요합니다. 이제 C ++ 11 호환 컴파일러가 널리 사용 가능해 졌으므로이 중장비는 지나치게 크고 불필요한 의존성이되었습니다.

이 라이브러리는 바인딩 생성과 관련이없는 모든 것이 제거 된 Boost.Python의 작은 자체 포함 버전입니다. 주석이 없으면 코어 헤더 파일에는 ~ 4K 코드 행만 필요하며 Python (2.7 또는 3.x 또는 PyPy2.7> = 5.7) 및 C ++ 표준 라이브러리에 의존합니다. 이 콤팩트 한 구현은 새로운 C ++ 11 언어 기능 (특히 튜플, 람다 함수 및 가변 템플릿) 덕분에 가능했습니다. 이 라이브러리는 생성 된 이후 Boost.Python을 넘어 여러 가지 방식으로 성장하여 많은 일반적인 상황에서 바인딩 코드가 훨씬 간단 해졌습니다.

pybind11은 현재 Microsoft Python C 바인딩 문서에서 강조한 유일한 비원시 대안입니다. https://docs.microsoft.com/en-us/visualstudio/python/working-with-c-cpp-python-in- visual-studio? view = vs-2019 ( 아카이브 ).

Ubuntu 18.04, pybind11 2.0.1, Python 3.6.8, GCC 7.4.0에서 테스트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.