2009-07-26 10 views
5

पायथन मैनुअल का कहना है कि आप सी और सी ++ दोनों में पाइथन के लिए मॉड्यूल बना सकते हैं। क्या आप C++ का उपयोग करते समय कक्षाओं और टेम्पलेट्स जैसी चीज़ों का लाभ उठा सकते हैं? क्या यह शेष पुस्तकालयों और दुभाषिया के साथ असंगतताओं को नहीं बनाएगा?क्या मैं पाइथन को विस्तारित करते समय सी ++ सुविधाओं का उपयोग कर सकता हूं?

+0

आप मुख्य रूप से सी ++ लक्षित कर रहे हैं http://stackoverflow.com/q/10368141/151641 – mloskot

उत्तर

8

इससे कोई फ़र्क नहीं पड़ता कि हुक फ़ंक्शंस का कार्यान्वयन सी या सी ++ में लागू किया गया है या नहीं। असल में, मैंने पहले से ही कुछ पायथन एक्सटेंशन देखे हैं जो सी ++ टेम्पलेट्स और यहां तक ​​कि बूस्ट लाइब्रेरी का सक्रिय उपयोग करते हैं। कोई समस्या नहीं है। :-)

2

आप जो रुचि रखते हैं वह SWIG नामक एक प्रोग्राम है। यह सी ++ कोड के लिए पाइथन रैपर और इंटरफेस उत्पन्न करेगा। मैं इसे टेम्पलेट्स, विरासत, नामस्थान आदि के साथ उपयोग करता हूं और यह अच्छी तरह से काम करता है।

+0

को दिए गए उत्तर पर एक नजर डालें, बड़ा घूँट निश्चित रूप से आप उपयोग करना चाहते उपकरण नहीं है। यह सुविधाजनक है कि यह सी ++ में अच्छी तरह से लपेट के लिए अगर यह क्या आप के साथ काम कर रहे हैं का एक छोटा सा हिस्सा है पर्याप्त समझता है, लेकिन यह सी ++ समर्थन के लिए Boost.Python स्पर्श नहीं कर सकते हैं। –

+0

@Nick: मैं बूस्ट :: अजगर पुस्तकालय को देखा है, और मैं आश्वस्त यह बेहतर है नहीं कर रहा हूँ। बूस्ट का उपयोग करने वाले सभी टेम्पलेटिंग और मैक्रो जादू नाजुक हो सकते हैं, और यह कोड के साथ क्या किया जा सकता है इसे सीमित करता है। –

+0

डाउनवोट क्यों? यह "उत्तर" से अधिक उपयोगी उत्तर है। –

3

बूथ लोगों के पास पाइथन द्वारा उपयोग के लिए सी ++ कोड को लपेटने का एक अच्छा स्वचालित तरीका है।

यह कहा जाता है: Boost.Python

यह बड़ा घूँट, विशेष रूप से टेम्पलेट metaprogramming से सी ++ बेहतर निर्माणों में से कुछ से संबंधित है।

1

आप सी ++ भाषा की सभी सुविधाओं का उपयोग करने में सक्षम होना चाहिए। Extending Python Documentation (2.6.2) का कहना है कि आप सी ++ का उपयोग कर सकते हैं, लेकिन निम्न चेतावनियां का उल्लेख है:

यह सी में विस्तार मॉड्यूल लिखने के लिए संभव है ++। कुछ प्रतिबंध लागू होते हैं। यदि मुख्य कार्यक्रम (पायथन दुभाषिया) संकलित और सी संकलक, वैश्विक या स्थैतिक कन्स्ट्रक्टर के साथ ऑब्जेक्ट्स का उपयोग नहीं किया जा सकता है। यह कोई समस्या नहीं है यदि मुख्य प्रोग्राम C++ कंपाइलर से जुड़ा हुआ है। कार्य जो होगा पाइथन दुभाषिया ( विशेष रूप से, मॉड्यूल प्रारंभिक फ़ंक्शंस) द्वारा बाहरी "सी" का उपयोग करके घोषित किया जाना चाहिए। यह अनावश्यक है extern "सी" में अजगर हेडर फाइल संलग्न करने {...} - वे पहले से ही इस फार्म का उपयोग करता है, तो प्रतीक __cplusplus परिभाषित (सभी हाल ही सी ++ compilers इस प्रतीक को परिभाषित) है।

पहले प्रतिबंध, "निर्माताओं के साथ वैश्विक या स्थिर वस्तुओं का प्रयोग नहीं किया जा सकता है", जिस तरह से है सबसे C++ कम्पाइलर भंडारण अवधि के इस प्रकार के साथ वस्तुओं को प्रारंभ। उदाहरण के लिए, निम्नलिखित कोड पर विचार करें:

class Foo { Foo() { } }; 

static Foo f; 

int main(int argc, char** argv) {} 

संकलक ताकि 'फू' निर्माता 'एफ' के लिए लागू किया जाता है मुख्य निष्पादित हो जाता है इससे पहले कि विशेष कोड फेंकना है। यदि आपके पाइथन एक्सटेंशन और में स्थिर संग्रहण अवधि के साथ ऑब्जेक्ट हैं, तो पाइथन दुभाषिया संकलित नहीं है और सी ++ के लिए लिंक किया गया है, तो यह विशेष प्रारंभिक कोड नहीं बनाया जाएगा।

दूसरा प्रतिबंध, "पाइथन दुभाषिया (विशेष रूप से, मॉड्यूल प्रारंभिक कार्यों) द्वारा किए जाने वाले कार्यों को बाहरी" सी "का उपयोग करके घोषित किया जाना है, को सी ++ नाम मैंगलिंग के साथ करना है। अधिकांश सी ++ कंपाइलर्स उनके नामों को उलझन में डालते हैं ताकि वे सी टूलचेन्स के लिए प्रदान किए गए समान लिंकर्स का उपयोग कर सकें।उदाहरण के लिए मान लीजिए कि आप था:

void a_function_python_calls(void* foo); 

सी ++ संकलक 'a_function_python_calls @ 1vga' की तरह कुछ करने के लिए नाम 'a_function_python_calls' के लिए संदर्भ परिवर्तित कर सकते हैं। पाइथन लाइब्रेरी से लिंक करने का प्रयास करते समय आपको एक अनसुलझा बाहरी मिल सकता है।

+0

, इन समस्याओं सी ++ लिंकेज के लिए किसी भी सी के अनुरूप है, और करने के लिए अद्वितीय नहीं हैं अजगर। आप अजगर दुभाषिया की निर्माण प्रक्रिया को नियंत्रित करते हैं (उदा आप एम्बेड करने और विस्तार, बस का विस्तार नहीं कर रहे हैं), तो आप के रूप में आप एक सी ++ संकलक और संयोजक के साथ अजगर का निर्माण कर सकते हैं, इस बारे में चिंता करने की जरूरत नहीं है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^