2011-03-23 5 views
6

최근에 부스트 - 파이썬의 존재를 발견하고 그것을 명백한 단순성으로 놀라게했습니다. 나는 그것을 시험해보고 싶었고 기존의 C++ 라이브러리를 감싸기 시작했다. 약자로부스트 파이썬에서 초기화/정리 함수를 래핑하는 방법

:

기본 라이브러리 API 호출을 포장하는 동안은 매우 간단합니다 (아무것도 특별한, 그냥 평범한 함수 호출과 매우 일반적인 매개 변수)입니다, 나는 제대로 초기화/정리 기능을 래핑하는 방법을 모른다 , 내 C++ 라이브러리는 프로그램이 시작될 때 호출자가 먼저 mylib::initialize()을 호출하고 끝나기 전에 mylib::cleanup()을 호출해야합니다 (사실 실제로는 이니셜 라이저 객체가 있지만 실제로는 관련이 없습니다).

부스트 파이썬을 사용하여 어떻게 포장해야합니까?

파이썬 사용자에게 mymodule.initialize()mymodule.cleanup()을 호출하도록 강요하는 것은 매우 pythonic 인 것처럼 보입니다. 거기에 어떤 방식 으로든 자동적 인 방식으로 있습니까? 이상적으로는 initialize()에 대한 호출은 모듈을 가져올 때 투명하게 수행되고 cleanup()에 대한 호출은 파이썬 스크립트가 끝날 때 완료됩니다.

그렇게 할 방법이 있습니까? 그렇지 않다면, 가장 우아한 해결책은 무엇입니까?

감사합니다.

답변

9

가드 객체를 사용하여 모듈의 숨겨진 속성에 할당 할 수 있습니다.

struct MyLibGuard 
{ 
    MyLibGuard() { myLib::initialize();} 
    ~MyLibGuard() { myLib::cleanup();} 
}; 

using namespace boost::python; 

BOOST_PYTHON_MODULE(arch_lib) 
{ 
    boost::shared_ptr<MyLibGuard> libGuard = new MyLibGuard(); 

    class_<MyLibGuard, boost::shared_ptr<MyLibGuard>, boost::noncopyable>("MyLibGuard", no_init); 
    scope().attr("__libguard") = libGuard; 

} 
+0

이 방법을 사용하는 것이 가장 좋습니다. 자주 boost :: python을 사용하면 위에서 설명한 것처럼 특수화 된 기능을 필요로하는 경우 간단한 구조체를 만들면됩니다. –

+0

답변 해 주셔서 감사합니다. 나는 그것을 시도하고 당신을 계속 게시 할 것입니다 :) – ereOn

+0

나는 컴파일 할 수 있도록'class__'로'class__'을 대체해야했습니다. 파이썬이 불평하지 않도록 마지막 두 줄을 바꾸어야했다. 고맙습니다. 변경 사항을 반영하기 위해 답변을 편집해도 되겠습니까? – ereOn

관련 문제