C ++ API를 Python에 노출시킵니다
문제
현재 프로젝트를 진행하고 있습니다. 프로그램을 스크립트 할 수 있도록 C ++ 클래스를 Python으로 포장해야했습니다. 따라서 내 특정 경험은 또한 우리 프로그램에 Python 통역사를 포함시키는 것도 포함되었습니다.
내가 시도한 대안은 다음과 같습니다.
boost.python
Boost.python이 생산 한 Cleaner API를 좋아했지만 사용자가 추가 종속성을 설치해야한다는 사실로 인해 SWIG로 전환했습니다.
통음
SWIG의 주요 장점은 최종 사용자가 최종 프로그램을 사용하기 위해 설치해야한다는 것입니다.
당신은 이것을 무엇을했는지, 그리고 그것에 대한 당신의 경험은 무엇입니까?
해결책
나는 동일한 프로젝트를 위해 두 가지를 모두 사용했습니다. 부스트는 STL과 더 잘 통합되고 특히 C ++ 예외가 더 좋습니다. 또한 메모리 관리 메커니즘 (C ++ 메모리 관리 및 Python GC를 연결하려는 시도)은 SWIG보다 훨씬 유연합니다. 그러나 SWIG가 있습니다 많이 더 나은 문서화, 외부 의존성이 없으며, 파이썬을 위해 Swig로 라이브러리를 랩핑하면 Java/Perl/Ruby Wrapper를 얻는 것도 절반 이상입니다.
나는 명확한 선택이 있다고 생각하지 않습니다. 소규모 프로젝트의 경우, 나는 Boost.python과 함께 다시 갈 것입니다.
다른 팁
편집 - Robin Project는 슬프게 버려졌으며 오늘날에는별로 사용되지 않을 것입니다.
나는 사용했다 남자 이름 큰 성공으로.
엄청난 C ++ 유형과 통합하고 공유 객체에 컴파일하고 포함 할 단일 .cpp 파일을 작성합니다.
제안합니다 한모금. SIP는 다음과 같은 이유로 인해 SWIG보다 낫습니다.
주어진 파일 세트의 경우 SWIG는 SIP보다 더 많은 복제 (오버 헤드) 코드를 생성합니다. SIP는 정적 또는 동적으로 연결될 수있는 라이브러리 파일을 사용하여 덜 중복 (오버 헤드) 코드를 생성하도록 관리합니다. 다시 말해 SIP는 확장 성이 향상됩니다.
SIP 실행 시간은 SWIG의 실행 시간보다 훨씬 적습니다. 나타내다 파이썬 래퍼 도구 : 성능 연구. 불행히도 링크가 고장났습니다. 요청시 공유 할 수있는 개인 사본이 있습니다.
Boost :: Python의 큰 장점은 ipython 쉘에서 탭 완료를 허용한다는 것입니다. 부스트로 직접 노출 된 C ++ 클래스를 가져 오거나 서브 클래스를 가져 오며 그때부터는 순수한 Python 클래스처럼 작동합니다.
단점 : 부스트를 설치하고 사용하는 데 시간이 오래 걸리기 때문에 모든 탭 완성 시간 절약이 상각되지 않을 것입니다 ;-(
그래서 나는 Swig : 종과 휘파람이 없지만 짧은 입문 예를 들어 안정적으로 작동합니다.