2011-03-23 15 views
6

में एक init/cleanup फ़ंक्शन को कैसे लपेटें मैंने हाल ही में बूस्ट-पायथन के अस्तित्व की खोज की और इसकी स्पष्ट सादगी से आश्चर्यचकित हुआ। मैं इसे एक कोशिश देना चाहता था और मौजूदा सी ++ लाइब्रेरी को लपेटना शुरू कर दिया था।Boost python

बुनियादी पुस्तकालय API कॉल लपेटकर जबकि काफी सरल (कुछ भी नहीं विशेष, बस नियमित कार्यप्रणाली कॉल और बहुत ही सामान्य पैरामीटर) है, मैं नहीं जानता कि कैसे ठीक प्रारंभ/सफाई कार्यों रैप करने के लिए:

यह खड़ा के रूप में , मेरे सी ++ लाइब्रेरी को कॉलर को प्रोग्राम शुरू होने पर 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

मैं इसे करने का सबसे अच्छा तरीका मानता हूं। बूस्ट :: पायथन के साथ अक्सर जब आपको विशेष कार्यक्षमता की आवश्यकता होती है तो आप ऊपर की तरह एक सरल संरचना बनाते हैं। –

+0

आपके उत्तर के लिए धन्यवाद। मैं इसे आज़मा दूंगा और आपको पोस्ट कर दूंगा :) – ereOn

+0

मुझे संकलित करने में सक्षम होने के लिए 'class_' के साथ 'class__' को प्रतिस्थापित करना था। और पिछले 2 लाइनों को स्विच करना पड़ा ताकि पाइथन शिकायत न करे। आपका बहुत बहुत धन्यवाद। क्या आपको दिमाग है यदि मैं परिवर्तनों को प्रतिबिंबित करने के लिए आपके उत्तर में संपादित करता हूं? – ereOn