2013-10-29 4 views
5

मैं एक बड़ी पायथन परियोजना के कुछ बिट्स को तेज करने के लिए सी उठा रहा हूं। निरंतर चल रहे पायथन लिपि में नए फ़ंक्शंस जोड़ने के लिए, मैंने कभी-कभी एक .py फ़ाइल की जांच की है और इसकी सामग्री को एकीकृत किया है। मैं सोच रहा था कि सी में समकक्ष करने का कोई तरीका था या नहीं, क्या फ्लाई पर गतिशील लाइब्रेरी की सामग्री लेने का कोई तरीका है?सी में, क्या गतिशील लाइब्रेरी को पुन: संकलित करके चल रहे प्रक्रिया में नए कोड को एकीकृत करना संभव है?

+0

क्या आपने ध्यान देने की आवश्यकता वाले कोड को तेज़ करने के लिए http://cython.org/ या http://pypy.org/ का उपयोग करने पर विचार किया है? – ChrisProsser

+3

@ChrisProsser। मैंने पिल्ला माना था, लेकिन सी सीखने का यह एक अच्छा बहाना था। जब मैं सी –

उत्तर

6

हां, आपको संकलन समय पर जोड़ने के बजाय लाइब्रेरी तक पहुंचने के लिए dlopen का उपयोग करने की आवश्यकता है, फिर dlsym इसके भीतर फ़ंक्शंस एक्सेस करने के लिए। एक नई लाइब्रेरी में स्विच करने के लिए आपको dlclose हैंडल की आवश्यकता होगी और एक नया मॉड्यूल बनाना होगा - इसे मॉड्यूल में लपेटने के लिए इसे सभी को संभालना बहुत मुश्किल काम नहीं है।

+0

पर एक संभाल पाता हूं तो मैं वास्तव में साइथन के साथ जा सकता हूं। चल रही प्रक्रिया में 'dlclose' का उपयोग करना मुश्किल हो सकता है। आपको यह सुनिश्चित करना होगा कि पुराने पुस्तकालय के लिए कोई संदर्भ नहीं है (उदा। इसमें एक स्थिर चर के लिए एक सूचक)। – ugoren

+0

मुझे यह उल्लेख करने लायक लगता है कि यद्यपि आप अपनी पसंद के किसी भी lib को लिंक कर सकते हैं और जब तक आप जानते हैं कि प्रतीक नाम किसी भी फ़ंक्शन का संदर्भ प्राप्त करता है, तो आपको ** अब ** फ़ंक्शन हस्ताक्षर अग्रिम में चाहिए यदि आप चाहें इसे सफलतापूर्वक कॉल करने के लिए। – alk

+0

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

2

आप इसे LoadLibrary/FreeLibaray के साथ विंडोज़ में कर सकते हैं मुझे यकीन है कि एक यूनिक्स समतुल्य है।

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