2009-08-12 2 views
4

상당히 큰 C++ 라이브러리를 지원하는 몇 개의 하위 라이브러리가 있습니다. 모든 것을 파이썬 확장으로 바꾸어야합니다. distutils는 크로스 플랫폼이 필요하기 때문에 사용하고 있습니다.하지만 더 나은 도구가 있다면 제안에 대해 열려 있습니다.Python non-trivial C++ Extension

distutils가 먼저 하위 라이브러리를 컴파일하고 기본 라이브러리의 확장을 만들 때이를 링크하는 방법이 있습니까?

답변

10

저는이 제품에서 방대한 C++ 라이브러리를 사용합니다. 바인딩을 작성하는 작업을 자동화하는 데 도움이되는 몇 가지 도구가 있습니다. 가장 인기있는 것은 SWIG입니다.이 도구는 잠시 동안 사용되어 많은 프로젝트에서 사용되고 일반적으로 잘 작동합니다.

SWIG에 대한 가장 큰 문제는 (제 의견으로는) SWIG 자체의 C++ 코드베이스가 다소 가볍게 생각할 수 있다는 것입니다. 그것은 STL 앞에 쓰여졌 고, 지금은 단지 오래되고 삐걱 거리는 자신의 반 다이나믹 타입 시스템입니다. 이것은 당신이 코어에 약간의 수정을해야만 (doxygen -> docstring 변환을 추가하려고 시도 했음에도 불구하고) 당신이 행운을 빕니다! 사람들은 SWIG가 생성 한 코드가 그렇게 효율적이지는 않지만 사실일지도 모릅니다. SWIG가 걱정할 정도의 병목 현상이라고는 결코 알지 못했습니다.

SWIG가 보트를 부양하지 않으면 사용할 수있는 다른 도구가 있습니다. boost.python도 인기가 있으며 C++ 코드에서 이미 부스트 라이브러리를 사용하는 경우 좋은 옵션이 될 수 있습니다. 단점은 거의 모든 C++ 템플릿 기반이므로 컴파일 시간이 많이 걸린다는 점입니다.

이러한 도구는 모두 노출 될 내용과 수행 방법을 정의하기 위해 일부 작업을 수행해야합니다. SWIG의 경우 C++ 헤더와 같은 인터페이스 파일을 제공하지만 아래에서 제거하고 복잡한 형식을 변환하는 방법을 SWIG에 알려주는 추가 지시문을 사용합니다. 이러한 인터페이스를 작성하는 것은 지루할 수 있으므로 pygccxml과 같은 것을보고 싶을 수 있습니다. 자동으로 생성하십시오.

해당 패키지의 작성자는 실제로 사용자가 좋아할만한 다른 확장자를 작성했습니다 : py++. 이 패키지는 두 가지 작업을 수행합니다. 즉, 바인딩 정의를 자동 생성하여 boost.python에 제공하여 파이썬 바인딩을 생성 할 수 있습니다. 기본적으로 대부분의 사람들을위한 완벽한 솔루션입니다. 특정 특별하거나 어려운 요구 사항이 없으면 거기에서 시작하고 싶을 것입니다.

참고 자료로 유용 할 수있는 몇 가지 다른 질문

:

또한 편리한 파이썬 바인딩 생성 도구의 this comparison을 찾을 수 있습니다. 알렉스가 코멘트에서 지적했듯이, 다소 오래되었지만 최소한 당신에게 풍경에 대한 아이디어를 제공합니다 ...

빌드를 구동하는 방법에 관해서는 더 고급 빌드 툴 그 distutils : 당신이 프레임 워크로 Waf 프레임 워크 (나는 다른 사람이 당신에게 말할 것입니다 SCons 갈 방법입니다 파이썬으로 스틱 싶다면,하지만 천천히 지옥으로 믿어 : 나는 이미 거기에 있었고!) .. .. .it는 약간의 학습이 필요하지만 주위를 둘러 보면 매우 강력합니다. 그리고 순수 파이썬이기 때문에 빌드 프로세스의 일부로 가지고있는 다른 파이썬 코드와 완벽하게 통합됩니다 (예를 들어 결국 Py ++를 사용하는 경우) ...

+1

"this comparisson"으로 인용 한 CERN 보고서는 6 세 이상이므로 큰 소금 (!)으로 채워야합니다. 특히 SIP는 수년 동안 ** 많이 발전 했으므로 오늘은 충분히 고려할 가치가 있습니다. –