UFO ET IT

Python과 C ++ 통합

ufoet 2020. 12. 15. 19:34
반응형

Python과 C ++ 통합


저는 C ++가 매우 유연한 언어이기 때문에 배우고 있습니다. 그러나 트위터, 페이스 북, 딜리셔스 등과 같은 인터넷 분야의 경우 Python이 훨씬 더 나은 솔루션으로 보입니다.

동일한 프로젝트에서 C ++와 Python을 통합 할 수 있습니까?


Python과 C / C ++를 연결하는 것은 쉬운 일이 아닙니다.

여기 에 파이썬 확장을 작성하는 다른 방법에 대한 이전 질문에 대한 이전 답변복사 / 붙여 넣기합니다 . Boost.Python, SWIG, Pybindgen 기능 ...

  • Python C-API를 사용하여 C 또는 C ++로 직접 확장을 작성할 수 있습니다 .

    한마디로 : 그것을하는 방법을 배우는 것 외에는 그렇게하지 마십시오. 올바르게하는 것은 매우 어렵습니다. 손으로 참조를 늘리거나 줄이면서 하나의 함수를 노출하기 위해 많은 코드를 작성해야하지만 이점은 거의 없습니다.

  • 스위 그 :

    장점 : 많은 스크립팅 언어에 대한 바인딩을 생성 할 수 있습니다.

    단점 : 파서가 작동하는 방식이 마음에 들지 않습니다. 그들이 어떤 진전을 이루 었는지 모르겠지만 2 년 전 C ++ 파서는 상당히 제한적이었습니다. 대부분의 경우 %문자 를 추가 하고 swig 파서에 추가 힌트를 제공하기 위해 .h 헤더를 복사 / 붙여 넣기 해야했습니다.

    또한 복잡한 유형 변환을 위해 때때로 Python C-API를 처리해야했습니다.

    더 이상 사용하지 않습니다.

  • Boost.Python :

    pro : 매우 완벽한 라이브러리입니다. C-API로 가능한 거의 모든 것을 C ++로 할 수 있습니다. 이 라이브러리로 C-API 코드를 작성할 필요가 없었습니다. 또한 라이브러리로 인해 버그가 발생하지 않았습니다. 바인딩 코드는 매력처럼 작동하거나 컴파일을 거부합니다.

    바인딩 할 C ++ 라이브러리가 이미있는 경우 현재 사용 가능한 최상의 솔루션 중 하나 일 것입니다. 그러나 다시 작성할 작은 C 함수 만 있다면 Cython을 사용해 볼 것입니다.

    단점 : 사전 컴파일 된 Boost.Python 라이브러리가없는 경우 Bjam (일종의 make 대체)을 사용할 것입니다. 나는 Bjam과 그 구문을 정말 싫어합니다.

    BP로 만든 Python 라이브러리는 비만 해지는 경향이 있습니다. 또한 컴파일하는 많은 시간 이 걸립니다 .

  • Py ++ : Boost.Python이 쉬워졌습니다. Py ++는 C ++ 파서를 사용하여 코드를 읽은 다음 Boost.Python 코드를 자동으로 생성합니다. 당신은 또한 그것의 저자로부터 큰지지를 받고 있습니다 (아니, 그것은 내가 아닙니다 ;-)).

    단점 : Boost.Python 자체로 인한 문제 만 있습니다.

    이 프로젝트 편집 은 중단 된 것 같습니다. 여전히 작동하지만 전환을 고려하는 것이 좋습니다.

  • Pybindgen :

    C-API를 다루는 코드를 생성합니다. Python 파일에서 함수와 클래스를 설명하거나 Pybindgen이 헤더를 읽고 자동으로 바인딩을 생성하도록 할 수 있습니다 (이를 위해 Py ++ 작성자가 작성한 Python 라이브러리 인 pygccxml을 사용합니다).

    단점 : Boost.Python보다 작은 팀이있는 젊은 프로젝트입니다. 여전히 몇 가지 제한 사항이 있습니다. 자체 C ++ 예외를 노출 할 수 없으며 C ++ 클래스에 대해 다중 상속을 사용할 수 없습니다.

    어쨌든 시도해 볼 가치가 있습니다!

  • Pyrex 및 Cython :

    여기에서는 실제 C / C ++가 아니라 Python과 C를 혼합하여 작성합니다.이 중간 코드는 일반 Python 모듈을 생성합니다.

2013 년 7 월 22 일 편집 : 이제 Py ++가 중단 된 것처럼 보이며 이제 좋은 대안을 찾고 있습니다. 현재 C ++ 라이브러리에 대해 Cython을 실험하고 있습니다. 이 언어는 Python과 C의 혼합입니다. Cython 함수 내에서 Python 또는 C / C ++ 엔티티 (함수, 변수, 객체 등)를 사용할 수 있습니다.

Cython은 배우기 쉽고 성능이 매우 뛰어나며 레거시 C ++ 라이브러리를 인터페이스 할 필요가 없다면 C / C ++를 완전히 피할 수도 있습니다.

그러나 C ++의 경우 몇 가지 문제가 있습니다. Py ++보다 "자동 마법"이 적으므로 안정적인 C ++ API (이제 내 라이브러리의 경우)에 더 적합 할 것입니다. Cython에서 내가 보는 가장 큰 문제는 C ++ 다형성입니다. Py ++ / boost : python을 사용하면 C ++에서 가상 메서드를 정의하고 Python에서 재정의하고 C ++ 내에서 Python 버전을 호출 할 수있었습니다. Cython을 사용하면 여전히 가능하지만 C-Python API를 명시 적으로 사용해야합니다.

2017-10-06 수정 :

Boost.Python과 유사하지만 몇 가지 잠재적 인 이점 이있는 새로운 pybind11이 있습니다. 예를 들어 C ++ 11 언어 기능을 사용하여 새 바인딩을 더 간단하게 만들 수 있습니다. 또한 헤더 전용 라이브러리이므로 사용하기 전에 컴파일 할 것이없고 링크 할 라이브러리가 없습니다.

나는 그것을 조금 가지고 놀았고 실제로 사용하기 매우 간단하고 즐거웠습니다. 유일한 두려움은 Boot.Python과 마찬가지로 컴파일 시간이 길고 라이브러리가 커질 수 있다는 것입니다. 아직 벤치 마크를하지 않았습니다.


예, 가능하고 권장되며 문서화 됩니다. 나는 그것을 스스로 해왔고 그것이 매우 쉽다는 것을 알았습니다.


Python / C API 참조 설명서 -확장 모듈을 작성하거나 Python을 포함하려는 C 및 C ++ 프로그래머가 사용하는 API입니다.

파이썬 인터프리터 확장 및 임베딩

새 모듈로 Python 인터프리터를 확장하기 위해 C 또는 C ++로 모듈을 작성하는 방법을 설명합니다. 이러한 모듈은 새 함수를 정의 할 수있을뿐만 아니라 새 개체 유형과 해당 메서드도 정의 할 수 있습니다. 이 문서는 또한 확장 언어로 사용하기 위해 다른 애플리케이션에 Python 인터프리터를 포함하는 방법을 설명합니다. 마지막으로 기본 운영 체제가이 기능을 지원하는 경우 인터프리터에 동적으로 (런타임에)로드 될 수 있도록 확장 모듈을 컴파일하고 링크하는 방법을 보여줍니다.


Pyrex를 사용해보십시오 . Python 용 C ++ 확장을 더 쉽게 작성할 수 있습니다.


우리는 제품에서 swig를 매우 성공적으로 사용 합니다.

기본적으로 swig는 C ++ 코드를 가져 와서 그 주위에 파이썬 래퍼를 생성합니다.


PyTorch가 통합하는 방법을 살펴 보는 것이 좋습니다.


이것 좀 봐:

C 또는 C ++로 Python 확장

"It is quite easy to add new built-in modules to Python, if you know how to program in C. Such extension modules can do two things that can't be done directly in Python: they can implement new built-in object types, and they can call C library functions and system calls.

To support extensions, the Python API (Application Programmers Interface) defines a set of functions, macros and variables that provide access to most aspects of the Python run-time system. The Python API is incorporated in a C source file by including the header "Python.h". "

http://www.python.org/doc/2.5.2/ext/intro.html

PS It's spelt "integrate" :)


I've used PyCxx http://cxx.sourceforge.net/ in the past and i found that it was very good.

It wraps the python c API in a very elegant manner and makes it very simple to use. It is very easy to write python extension in c++. It is provided with clear examples so it is easy to get started.

I've really enjoyed using this library and I do recommend it.


It depends on your portability requirements. I've been struggling with this for a while, and I ended up wrapping my C++ using the python API directly because I need something that works on systems where the admin has only hacked together a mostly-working gcc and python installation.

In theory Boost.Python should be a very good option, since Boost is available (almost) everywhere. Unfortunately, if you end up on a OS with an older default python installation (our collaboration is stuck with 2.4), you'll run into problems if you try to run Boost.Python with a newer version (we all use Python 2.6). Since your admin likely didn't bother to install a version of Boost corresponding to every python version, you'll have to build it yourself.

So if you don't mind possibly requiring some Boost setup on every system your code runs on, use Boost.Python. If you want code that will definitely work on any system with Python and a C++ compiler, use the Python API.


Another interesting way to do is python code generation by running python itself to parse c++ header files. OpenCV team successfully took this approach and now they have done exact same thing to make java wrapper for OpenCV library. I found this created cleaner Python API without limitation caused by a certain library.


You can write Python extensions in C++. Basically Python itself is written in C and you can use that to call into your C code. You have full access to your Python objects. Also check out Boost.Python.

ReferenceURL : https://stackoverflow.com/questions/1153577/integrate-python-and-c

반응형