2011-03-23 14 views
6

Son zamanlarda boost-python'un varlığını keşfettim ve görünürdeki basitliğiyle hayrete düştüm. Bunu denemek istedim ve varolan bir C++ kütüphanesini sarmalamaya başladım. HaliyleBoost python'da bir init/cleanup işlevi nasıl yapılır

:

temel kütüphane API çağrıları sarma yaparken oldukça basit (özel bir şey, sadece normal işlev çağrıları ve çok yaygın parametreler), ben düzgün başlatma/temizleme fonksiyonları sarmak için nasıl bilmiyorum , benim C++ kitaplığı, program başladığında arayanın önce mylib::initialize() aramasını ve bitmeden önce mylib::cleanup()'u çağırmasını gerektirir (aslında bununla ilgilenen bir başlatıcı nesnesi de vardır, ancak muhtemelen ilgisizdir).

Takviye python'u kullanarak nasıl sarmalıyım? mymodule.initialize() ve mymodule.cleanup() çağırmak için bir Python kullanıcıyı zorlama

çok pythonic görünmemektedir. Otomatik bir şekilde bunun için herhangi bir yolu var mı? İdeal olarak, initialize() numaralı çağrı, modül içe aktarıldığında ve cleanup() numaralı çağrı da python komut dosyası bittiğinde de yapılır.

Bunu yapmanın bir yolu var mı? Değilse, en zarif çözüm nedir?

Teşekkür ederiz.

cevap

9

Bir güvenlik görevlisi yapmayı ve onu modülünüzün gizli bir özelliğine atamayı deneyebilirsiniz.

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

Bunu yapmanın en iyi yolu olarak görüyorum. Boost :: python ile çoğu zaman fonksiyonellik konusunda uzmanlaşmanız gerekiyorsa, yukarıdaki gibi basit bir yapı oluşturursunuz. –

+0

Cevabınız için teşekkür ederiz. Ben bir denemek ve sen-ecek tutmak bekliyorum :) – ereOn

+0

Ben derlemek mümkün 'class_' ile class__' değiştirmek zorunda kaldı. Ve son 2 satırı() python'u şikayet etmeyecek şekilde değiştirmeliydi. Çok teşekkür ederim. Değişiklikleri yansıtmak için cevabınızı düzenler miyim? – ereOn

İlgili konular