2011-07-05 11 views
12

मुझे पता है कि अजगर में सी समारोह इंटरफेस करने के कई तरीके हैं: Python C API, scipy.weave, ctypes, pyrex/cython, SWIG, Boost.Python, Psyco ... क्या उन्हें सबसे अच्छा से प्रत्येक के लिए कर रहे हैं? मुझे दूसरों के बजाय किसी दिए गए विधि का उपयोग क्यों करना चाहिए? जब मुझे पायथन और सी के बीच बाध्यकारी चुनने की आवश्यकता होती है तो क्या माना जाना चाहिए?पायथन के साथ सी (या सी ++) इंटरफेसिंग के लिए अलग-अलग विकल्प क्या हैं?

मुझे इस बारे में कुछ विचार विमर्श पता है, लेकिन वे सभी अपूर्ण लगता है ...

मुझे पता है कि StackOverflow पर कुछ सवाल भी जुड़े हुए हैं।

+2

-1। यह सवाल अत्यधिक व्यापक है। –

+0

@ स्टेवेन रूंबास्की: मैं असहमत हूं। यह एक अच्छा सवाल है, हालांकि मुझे लगता है कि मुझे यह जानना अच्छा लगेगा कि उपयोगकर्ता ने वास्तव में * कोशिश की है *। –

+0

@ प्लैटिनम अज़ूर: मैंने -1 पर थोड़ा सा झुकाया, लेकिन आखिरकार फैसला किया कि इस प्रश्न का एक अच्छा जवाब वास्तव में लंबा और विस्तृत होना होगा। यह काफी हद तक व्यक्तिपरक होगा। –

उत्तर

8

मैं इन सभी तरीकों का उपयोग नहीं किया, हालांकि मैं उन सब को एक बिंदु या किसी अन्य पर जांच की है ...

अजगर सी एपीआई: सी कोड है कि एक अजगर मॉड्यूल में आयात किया जा सकता करने के लिए संकलित लिखने के लिए अजगर। या एक पायथन मॉड्यूल लिखने के लिए जो कुछ सी पुस्तकालय के साथ इंटरफ़ेस के लिए "गोंद" कोड के रूप में कार्य करता है।

scipy.weave: आप, यदि आप सांख्यिक काम करने के लिए NumPy और SciPy का उपयोग कर रहे हैं, अपने अजगर कोड में सी कोड के टुकड़े को गिरवी रखना इस पर विचार करने देता है। सी कोड एक स्ट्रिंग के रूप में होगा, जैसे, weave.inline ('printf ("% s", foo)') उदाहरण के लिए।

ctypes: एक पायथन मॉड्यूल जो आपको अपने पायथन कोड से सी कोड में कॉल करने की अनुमति देता है। आप मूल रूप से साझा लाइब्रेरी आयात करते हैं और उसके एपीआई में कॉल करते हैं। कुछ कॉल उन कॉलों के अंदर और बाहर डेटा को मार्शल करने के लिए आवश्यक हैं। यदि आप मौजूदा सी लाइब्रेरी का उपयोग कर रहे हैं जिसे आपने या किसी और ने लिखा है, तो मैं यहां शुरू करूंगा।

pyrex/cython: आप अजगर कोड है कि सी कोड में उत्पन्न हो जाएगा (जो एक पायथन मॉड्यूल के रूप में आयात किया जा सकता है) और, जाहिर है, तेजी से चलाने के (कुछ विशेष सिंटैक्स का उपयोग) लिखने देता है कि उसे चलाया गया था पायथन दुभाषिया के माध्यम से। यह "पायथन सी एपीआई" मार्ग की तरह है, केवल यह आपके लिए सी कोड उत्पन्न करता है। उपयोगी अगर आपके पास कोड का कुछ हिस्सा है जो आपकी बाधा है और वास्तव में धीमी है। सिथन का उपयोग करके उस समारोह को फिर से लिखें और इसे कॉलिंग कोड से आयात करें।

SWIG: सी/सी ++ लाइब्रेरी के लिए रैपर कोड जेनरेट करता है। आपको एक पायथन मॉड्यूल के साथ समाप्त होना चाहिए जिसे आप आयात और उपयोग कर सकते हैं।

बूस्ट। पायथन: यह वह है जिसे मैं कम से कम जानता हूं। मुझे लगता है कि यह SWIG के समान है हालांकि आप स्वयं रैपर परत लिखते हैं, लेकिन बूस्ट मैक्रोज़/फ़ंक्शंस से बहुत मदद के साथ।

साइको: आपके पायथन कोड को थोड़ा बढ़ाता है, मुझे इसके साथ बहुत भाग्य नहीं मिला है। मैं इसके साथ अपना समय बर्बाद नहीं करूंगा। अपना कोड प्रोफाइल करें, अपनी बाधाओं को ढूंढें और उपरोक्त तकनीकों में से किसी एक का उपयोग करके उन्हें गति दें।

4

यह केवल अपने प्रश्न के एक हिस्से के लिए एक संक्षिप्त जवाब है, लेकिन: उदाहरण के लिए:

ctypes शायद सबसे अच्छा आप एक पहले से मौजूद सी पुस्तकालय है जब है कि आप पायथन के साथ उपयोग करना चाहते हैं।

अजगर सी एपीआई सबसे अच्छा है जब आप या तो सी में कुछ है कि अजगर के पहलुओं का इस्तेमाल करता है लिखते हैं, या सी में अजगर के लिए एक विस्तार लिखना चाहते हैं करना चाहते हैं (Cython ऐसा करने का एक और तरीका है।)

बेशक, उन दोनों को आपके प्रश्न में लिंक किए गए SO प्रश्नों के कुछ उत्तरों में अधिक विस्तार से विस्तार से विस्तारित किया गया है।

+0

मैंने हाल ही में दोनों SWIG और ctypes का प्रयास किया है, और ctypes सिरदर्द से कम तरीके से बाहर निकला। आप अपने सी/सी ++ को साझा लाइब्रेरी के रूप में संकलित कर सकते हैं, फिर पाइथन स्क्रिप्ट से फ़ंक्शन आयात और कॉल कर सकते हैं। – Chriszuma

+0

लेकिन, 'ctypes' आसानी से C++ क्लास ऑब्जेक्ट बनाने में सक्षम नहीं है। –

+0

@ 陈家胜 पर्याप्त सच है, जहां ड्रेगेंट का जवाब आता है। (हालांकि सी ++ भागों के लिए सी-इंटरफेस रैपर प्रदान करना हमेशा संभव है।) – JAB

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