2009-07-20 4 views
38

매우 유연한 언어이기 때문에 C++을 배우고 있습니다. 그러나 트위터, 페이 스북, 딜리셔스 (Delicious)와 같은 인터넷 분야에서는 파이썬이 훨씬 더 나은 해결책으로 보인다.Python과 C++ 통합

C++과 Python을 같은 프로젝트에 통합 할 수 있습니까?

+5

"통합"이란 무엇을 의미합니까? 런타임에 생성되거나 선택된 파이썬 스크립트를 실행하는 C++ 프로그램? C++ 루틴을 호출하는 파이썬 스크립트? 소스에서 두 언어로 된 하나의 바이너리? – peterchen

+2

[Boost.Python] (http://www.boost.org/doc/libs/1_39_0/libs/python/doc/index.html). 두 언어 모두에서 최고의 비트를 사용하십시오! – MattyT

답변

67

인터페이싱 파이썬을 C와 함께/C++는 쉬운 일이 아니다. 여기

내가 복사 /에 대한 이전의 질문에 previous answer 붙여 넣기 Boost.Python, SWIG, Pybindgen을 특징으로하는 다른 메소드 ...

  • 확장자를 쓸 수 있습니다. 너 자신은 C 또는 C++에서 Python C-API.

    단어 : 수행 방법을 배우는 것 외에는하지 마십시오. 올바르게하는 것은 매우 어렵습니다. 손으로 참조를 증가 및 감소시키고 하나의 기능을 노출하기 위해 많은 코드를 작성해야합니다. 이점은 거의 없습니다.

  • Swig

    :

    프로 : 당신이 많은 스크립팅 언어에 대한 바인딩을 생성 할 수 있습니다.

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

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

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

  • Boost.Python

    는 :

    프로 : 그것은 매우 완전한 라이브러리입니다. 이것은 C-API에서 가능하지만 C++에서 가능한 모든 것을 할 수있게합니다. 필자는이 라이브러리로 C-API 코드를 작성할 필요가 없었습니다. 라이브러리 때문에 버그가 발생하지도 않았습니다. 바인딩을위한 코드는 매력처럼 작동하거나 컴파일을 거부합니다.

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

    단점 : 미리 컴파일 된 Boost.Python 라이브러리가없는 경우 Bjam (일종의 make 대체)을 사용하게됩니다. 나는 Bjam과 그 구문을 정말로 싫어한다.

    B.P로 만든 파이썬 라이브러리는 비만이되는 경향이 있습니다. 또한 시간이 걸립니다.

  • Py++ : Boost.Python이 쉽게 만들어졌습니다. Py ++는 C++ 파서를 사용하여 코드를 읽고 Boost.Python 코드를 자동으로 생성합니다. 당신은 또한 저자로부터 큰지지를 얻었습니다 (아니요 ;;)).

    단점 : Boost.Python 자체로 인한 문제 만.

    편집이 프로젝트는 중단되었습니다. 아마도 여전히 작동하는 동안 전환을 고려하는 것이 좋습니다.

  • Pybindgen

    :

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

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

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

  • 파이렉스와 Cython : 여기 당신이 진짜 C/C++하지만 파이썬와 C 사이의 혼합이 중간 코드는 일반 파이썬 모듈을 생성 쓰지 않는다

    .

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

사이 썬은 배울 매우 쉽습니다 매우 좋은 성능을 가지고 있으며, 당신도 당신이 기존의 C++ 라이브러리 인터페이스가없는 완전히 경우 C/C++를 방지 할 수 있습니다.

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

편집 2017년 10월 6일 :

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

나는 그걸 가지고 놀았으며 실제로 사용하기가 아주 쉽고 즐겁습니다. 내 유일한 두려움은 Boot.Python과 마찬가지로 긴 컴파일 시간과 큰 라이브러리로 이어질 수 있다는 것입니다. 나는 아직 어떤 벤치 마크도하지 않았다.

+1

Py ++에 대한 링크가 더 이상 작동하지 않습니다. 나는 그들이 여기로 옮겼다 고 생각한다 : http://www.ohloh.net/p/pygccxml –

+0

@ ZoranPavlovic : 실제로 Py ++는 중단되었다. 링크를 업데이트했다. Thanks – ascobol

+0

PySide에 사용 된 Shiboken을 추가해야합니다. 끔찍하게 기록되었지만 굉장합니다. – refi64

1

Python extensions을 C++로 작성할 수 있습니다. 기본적으로 파이썬 자체는 C로 작성되었으며,이를 사용하여 C 코드를 호출 할 수 있습니다. 파이썬 객체에 대한 모든 액세스 권한이 있습니다. Boost.Python도 확인하십시오.

+0

문서를 보내 주셔서 감사합니다! –

+0

OttoA 문서도 확인하십시오. http://docs.python.org/extending/extending.html –

+6

Python! = CPython. CPython은 C. C! = C++로 작성됩니다. –

7

예, 가능하며 권장되며 documented입니다. 나는 그것을 스스로했고 그것을 매우 쉽게 찾았다.

+0

경험과 훌륭한 문서를 보내 주셔서 감사합니다! –

+2

이 태스크를 쉽게 찾을 수 있도록 Python에 몇 개의 함수/클래스를 노출 시켰습니까? – ascobol

+0

@ascobol : 당신은 꽤 빨리 그것의 교수형을 얻을. – Mathieu

3

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

Extending and Embedding the Python Interpreter

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

3

시도 Pyrex. Python을위한 C++ 확장을 쉽게 작성합니다.

+1

Cython은 Pyrex의 후속 제품입니다. (이 답변을 2014 년에 방문하는 사람들을 돕기 위해 의견을 남기십시오.) –

+0

Cython을 Pyrex라고하는 포크라고하는 것이 더 정확할 것이라고 생각합니다. 몇 년 동안 Pyrex와 Cython은 동시에 개발되었습니다. 이 시점에서 파이렉스는 더 이상 적극적으로 개발되지 않아 새로운 개발을위한 이상적인 옵션이 아닙니다. – Brian

1

이를 참조하십시오

는 C 또는 C++

파이썬 확장

"당신이 할 수있는 C. 이러한 확장 모듈로 프로그래밍하는 방법을 알고 있다면, 파이썬에 새로운 내장 모듈을 추가하는 것은 매우 쉽다 파이썬에서 직접 할 수없는 두 가지 : 새로운 내장 객체 유형을 구현할 수 있으며 C 라이브러리 함수와 시스템 호출을 호출 할 수 있습니다.

파이썬 API (응용 프로그램 프로그래머 인터페이스)는 확장을 지원하기 위해 Python 런타임 시스템의 대부분의 측면에 대한 액세스를 제공하는 함수, 매크로 및 변수 세트 Python API는 "Python.h"헤더를 포함하여 C 소스 파일에 통합됩니다. "

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

PS 그것은 철자" "통합 :

2

나는 과거에 PyCxx http://cxx.sourceforge.net/을 사용했습니다 그리고 난 그것이 아주 좋은 것으로 나타났습니다.

그것은 매우 우아한 방식으로 파이썬 C API를 래핑하고 사용하기가 매우 쉽습니다. C++에서 파이썬 확장을 작성하는 것은 매우 쉽습니다. 그것은 명확한 예제와 함께 제공되므로 시작하기 쉽습니다.

정말이 라이브러리를 사용하는 것을 즐겼으며 권장합니다.

3

우리는 swig을 매우 성공적으로 사용하고 있습니다. 기본적으로 꿀꺽 꿀꺽

은 C++ 코드를 받아 주위에 파이썬 래퍼를 생성합니다.

2

휴대 성 요구 사항에 따라 다릅니다. 나는 이것을 잠시 고민하고 있었고, python API을 사용하여 C++을 랩핑했다. 관리자가 주로 작동하는 gcc와 python 설치를 해킹 한 시스템에서 작동하는 무언가가 필요하기 때문이다. 부스트를 사용할 수 (거의) 모든 곳이기 때문에 이론 Boost.Python에서

는 아주 좋은 옵션이 될 것이다. 당신이 (우리의 협력은 2.4 함께 붙어있다) 이전 기본 파이썬 설치와 OS에 끝날 경우 최신 버전으로 Boost.Python를 실행하려고하면 불행하게도, 당신이 문제로 실행하겠습니다 (우리 모두는 파이썬 2.6 사용). 관리자가 모든 Python 버전에 해당하는 Boost 버전을 설치하지 않으므로 직접 빌드해야합니다. 당신은 당신의 코드가 실행하는 모든 시스템에 대한 몇 가지 부스트 설정을 요구 가능성이 괜찮다면

그래서, Boost.Python를 사용합니다. Python 및 C++ 컴파일러가있는 시스템에서 제대로 작동하는 코드를 원하면 Python API를 사용하십시오.

1

재미있는 또 다른 방법은 파이썬 자체를 실행하여 C++ 헤더 파일을 구문 분석하여 파이썬 코드를 생성하는 것입니다. OpenCV team successfully took this approach 그리고 이제는 OpenCV 라이브러리 용 자바 래퍼를 만들기 위해 똑같은 작업을 수행했습니다. 나는 특정 라이브러리에 의해 제한없이이 더 깨끗한 파이썬 API를 만들었다.

0

나는 PyTorch가 어떻게 통합되는지 살펴볼 것을 권한다.