2011-03-23 27 views
6

我最近發現boost-python的存在,並且因爲它顯而易見而感到驚訝。我想嘗試一下,並開始打包現有的C++庫。如何在Boost中包裝init/cleanup函數python

雖然包裹的基本庫API調用非常簡單(沒有什麼特別的,只是普通的函數調用和很常見的參數),我不知道如何正確地包裹初始化/清理功能:

因爲它的立場,我的C++庫需要調用者在程序啓動時首先調用mylib::initialize(),並在調用結束之前調用mylib::cleanup()(實際上還有一個初始化對象負責處理該對象,但它可能不相關)。

我應該如何使用boost python來包裝它?

強制Python用戶撥打電話mymodule.initialize()mymodule.cleanup()似乎不是很方便pythonic。有沒有辦法以自動的方式呢?理想情況下,initialize()的調用將在導入模塊時透明地完成,並且在Python腳本結束時也調用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

我認爲這是做這件事的最好方法。通常情況下,如果你需要專門的功能,你可以像上面所做的那樣創建一個簡單的結構體。 – 2011-03-23 14:42:57

+0

謝謝你的回答。我會試一試,並讓你發佈:) – ereOn 2011-03-23 15:38:22

+0

我必須用'class_'替換'class__'才能編譯。並且必須切換()最後2行,以便python不會抱怨。非常感謝你。你介意我是否編輯你的答案以反映這些變化? – ereOn 2011-03-23 16:35:23