2011-05-11 5 views
1

C \ C++와 다른 언어 간의 바인딩 작성 작업을 자동화하는 데 도움이되는 여러 패키지가 있습니다.C++에서 임베디드 Python 확장 - C++ 인스턴스와 상호 작용하도록 디자인

제 경우에는 파이썬을 바인드하고 싶습니다. 그런 패키지의 옵션은 SWIG, Boost.PythonRobin입니다.

직선적 인 프로세스는이 패키지를 사용하여 C \ C++ 링크 가능 라이브러리 (주로 정적 함수 포함)를 만들고이를 사용하여 상위 언어를 확장하는 것입니다.

그러나 제 상황은 이미 C++에서 개발 된 작업 시스템을 가지고 있기 때문에 향후 Python으로 개발할 수 있도록 Python을 임베드 할 계획입니다.

파이썬 코드가 시스템에서 이미 실행중인 다양한 Singleton 인스턴스와 상호 작용할 수있는 방법으로 임베디드 Python을 확장하는 방법에 이러한 패키지를 사용하는 방법은 분명하지 않습니다. C++ 클래스를 인스턴스화하고 상호 작용할 수 있습니다.

내가 찾고있는 것은이 상황에 가장 적합한 디자인에 관한 통찰력입니다.

답변

2

Boost.python을 사용하면 스마트 포인터를 사용하는 경우 특히 많은 것을 할 수 있습니다. 파이썬에서 C++ 클래스를 상속 한 다음, 그 인스턴스를 C++ 코드로 전달하고 모든 것이 여전히 작동하도록 할 수 있습니다. 다양한 자료를 작성하는 방법에 대한 가장 좋아하는 자료는 (특히 "사용법"섹션을 확인하십시오.) http://wiki.python.org/moin/boost.python/입니다.

스마트 포인터 나 침입 포인터를 사용하는 경우 Boost.python은 PyObject 참조 계산으로 투명하게 변환되므로 특히 유용합니다. 또한 팩토리 함수를 파이썬 생성자처럼 보이게 만드는 것이 매우 훌륭합니다. 이것은 매우 깨끗한 파이썬 API를 만듭니다.

스마트 포인터를 사용하지 않는 경우에도 원하는 모든 작업을 수행 할 수 있지만 여러 가지 반환 정책과 수명 정책이 필요하므로 두통이 생길 수 있습니다.

0

짧게하려면 다음과 같이하십시오. 현대적인 대안 pybind11이 있습니다.

긴 버전 : 또한 파이썬을 임베드해야했습니다. C++ Python 인터페이스가 작기 때문에 C Api를 사용하기로 결정했습니다. 그것은 악몽으로 밝혀졌습니다. 클래스를 노출하면 복잡한 상용구 코드를 작성할 수 있습니다. Boost :: Python은 읽을 수있는 인터페이스 정의를 사용하여이를 방지합니다. 그러나 그 부스트가 정교한 문서가 부족하고 여전히 Python API를 호출해야하는 몇 가지 사항을 발견했습니다. 더 나아가 그들의 구축 시스템은 사람들에게 문제를주는 것으로 보인다. 나는 시스템에서 제공하는 패키지를 사용하기 때문에 나는 말할 수 없다. 마지막으로 파이썬 포크를 향상시키기 위해 파이썬 11을 사용해 보았습니다. 파이썬은 파이썬 API를 사용할 필요성, 람다를 사용할 수있는 능력, 쉬운 이해할 수없는 문서 및 자동 예외 변환의 부족과 같은 편리함과 부스트의 몇 가지 단점을 수정했습니다. . 더 나아가 그것은 헤더 일 뿐이며 배포에 대한 큰 의존성을 끌어 내지 못하기 때문에이를 확실히 추천 할 수 있습니다.