2010-10-17 9 views
8

मैं एक सॉफ्टवेयर प्लग-इन लिखने की कोशिश कर रहा हूं जो पायथन को एम्बेड करता है। विंडोज़ पर प्लग-इन तकनीकी रूप से एक डीएलएल है (यह प्रासंगिक हो सकता है)। Python Windows FAQ कहते हैं: अपने exe फ़ाइल मेंविंडोज़ पर पायथन एम्बेड करना: इसे डीएलएल क्यों होना चाहिए?

1.Do नहीं निर्माण अजगर सीधे। विंडोज़ पर, पाइथन को मॉड्यूल आयात करने के लिए एक डीएलएल होना चाहिए जो स्वयं डीएलएल हैं। (यह पहला कुंजी अनियंत्रित तथ्य है।) इसके बजाय, pythonNN.dll से लिंक करें; यह आमतौर पर सी: \ विंडोज \ सिस्टम में स्थापित है। एनएन पायथन संस्करण है, जो कि पायथन 2.3 के लिए "23" जैसी संख्या है।

मेरा सवाल यह है कि वास्तव में पाइथन एक डीएलएल क्यों होना चाहिए? यदि, मेरे मामले में, होस्ट एप्लिकेशन एक .exe नहीं है, लेकिन एक डीएलएल भी है, तो क्या मैं इसमें पायथन बना सकता हूं? या, शायद, इस नोट का मतलब है कि तृतीय पक्ष सी एक्सटेंशन pythonN.N.dll पर मौजूद होने पर निर्भर हैं और अन्य डीएलएल नहीं करेंगे? मान लीजिए कि मैं वास्तव में एक एकल डीएलएल चाहता हूं, मुझे क्या करना चाहिए?

मुझे लगता है कि dynload_win.c फ़ाइल है, जो विंडोज़ पर सी एक्सटेंशन आयात करने के लिए मॉड्यूल प्रतीत होता है और जहां तक ​​मैं देख सकता हूं, यह विस्तार फ़ाइल को स्कैन करता है कि यह pythonX.X.dll आयात करता है; लेकिन मुझे विंडोज़ के साथ अनुभव नहीं हुआ है और मैं वहां सभी कोड को समझ नहीं पा रहा हूं।

उत्तर

4

आप क्योंकि अन्यथा अजगर क्रम अन्य DLLs लोड नहीं कर सकता है, इसके बजाय प्रासंगिक कोड अपने निष्पादन में सीधे जोड़ने की एक DLL के रूप में pythonXY.dll से जोड़ने के लिए, की जरूरत है (विस्तार मॉड्यूल इस पर निर्भर करता है।) यदि आप कर अपना खुद का डीएलएल आप सैद्धांतिक रूप से उस डीएलएल में सभी पायथन कोड को लिंक कर सकते हैं, क्योंकि यह निष्पादन योग्य में समाप्त नहीं होता है लेकिन फिर भी एक डीएलएल में होता है। आपको लिंकिंग को सही तरीके से करने की देखभाल करनी होगी, हालांकि, मानक उपकरण (जैसे distutils) में से कोई भी आपके लिए यह नहीं करेगा।

हालांकि, आप पाइथन को कैसे एम्बेड करते हैं, इस पर ध्यान दिए बिना, आप के साथ डीएलएल के साथ नहीं कर सकते हैं, न ही आप किसी भी डीएलएल के साथ कर सकते हैं। एबीआई पायथन संस्करणों के बीच बदलता है, इसलिए यदि आपने पाइथन 2.6 के खिलाफ अपना कोड संकलित किया है, तो आपको python26.dll की आवश्यकता है; आप python25.dll या python27.dll का उपयोग नहीं कर सकते। और पायथन सिर्फ एक डीएलएल नहीं है; इसे अपनी मानक लाइब्रेरी की भी आवश्यकता है, जिसमें एक्सटेंशन मॉड्यूल (जो डीएलएल स्वयं हैं, हालांकि उनके पास .pyd एक्सटेंशन है।) dynload_win.c में कोड DLL लोड करने के लिए है, और pythonXY.dll लोड होने से संबंधित नहीं हैं।

संक्षेप में, अपनी प्लगइन में पायथन को एम्बेड करने के लिए, आपको प्लगइन के साथ पाइथन को शिप करने की आवश्यकता है, या आवश्यकता है कि सही पायथन संस्करण पहले से स्थापित हो।

+0

क्या होगा यदि मैं मानक पुस्तकालय एक्सटेंशन अपने आप संकलन और उन्हें अपने DLL (जो मेरी 'foo' और' bar' और सभी वस्तुओं है कि सामान्य रूप से 'pythonNN.dll' में जाने का किया जाएगा के खिलाफ लिंक के रूप में मैं में देखते हैं' पायथनकोर परियोजना ')? मेरे मामले में मानक लाइब्रेरी या तृतीय-पक्ष एक्सटेंशन के विशेष संस्करण होना ठीक है। –

+0

फिर भी आपको बाकी सभी मानक लाइब्रेरी (सभी .py फाइलें, और .pyc और .pyo आमतौर पर भी चाहिए)। वे पाइथन-संस्करण विशिष्ट भी हैं। आप उन्हें ज़िप कर सकते हैं, लेकिन आप उन्हें रखने से नहीं बच सकते हैं। –

+0

तो मूल रूप से, आपके आवेदन में पाइथन डीएलएल के बिना बंडल किए बिना कोई तरीका नहीं है? – viraj

0

पायथन को एक डीएल (मानक नाम के साथ) होना चाहिए, जैसे कि आपका एप्लिकेशन और प्लगइन, पाइथन के उसी उदाहरण का उपयोग कर सकता है।

प्लगइन डीएल पहले से ही एक python26.dll (या जो भी संस्करण) से लोड हो रहा है (और पायथन का उपयोग कर) की उम्मीद करने जा रहे हैं - यदि आपका अजगर आपके exe में स्थिर रूप से एम्बेडेड है, तो पाइथन लाइब्रेरी के दो अलग-अलग उदाहरण होंगे एक ही डेटा संरचनाओं का प्रबंधन।

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

1

* निक्स पर, निष्पादन योग्य समेत एक प्रक्रिया में सभी साझा वस्तुओं, उनके निर्यात किए गए नामों को एक आम पूल में योगदान देते हैं; किसी भी साझा ऑब्जेक्ट को पूल से किसी भी नाम को खींच सकते हैं और उन्हें पसंद करते हैं। यह उदा। पाइथन लाइब्रेरी स्थिर रूप से जुड़ा हुआ है जब मुख्य निष्पादन योग्य से संबंधित पायथन पुस्तकालय कार्यों को खींचने के लिए cStringIO.so

विंडोज़ पर, प्रत्येक साझा ऑब्जेक्ट का अपना स्वतंत्र नामों का पूल उपयोग कर सकता है। इसका अर्थ यह है कि इसे प्रासंगिक विभिन्न साझा वस्तुओं को पढ़ना चाहिए जिनके लिए उन्हें फ़ंक्शंस चाहिए। चूंकि मुख्य निष्पादन योग्य से सभी नाम प्राप्त करने के लिए यह बहुत काम है, इसलिए पाइथन कार्यों को अपने स्वयं के डीएलएल में अलग कर दिया गया है।

1

(क्षमा करें, मैंने एक बेवकूफ चीज की, मैंने पहले सवाल लिखा, और फिर पंजीकृत किया, और अब मैं इसे बदल नहीं सकता या जवाबों पर टिप्पणी नहीं कर सकता, क्योंकि स्टैक ओवरफ्लो का इंजन नहीं सोचता कि मैं लेखक हूं। मैं नहीं कर सकता यहां तक ​​कि उन लोगों का भी सही धन्यवाद जिन्होंने उत्तर दिया :(तो यह वास्तव में प्रश्न और टिप्पणियों का एक अद्यतन है।)

सभी सलाह के लिए धन्यवाद, यह बहुत मूल्यवान है। जहां तक ​​मैं कुछ प्रयासों के साथ समझता हूं, मैं पाइथन को स्थिर रूप से लिंक कर सकता हूं कस्टम DLL, बशर्ते कि मैं अन्य गतिशील लोड एक्सटेंशन अपने आप संकलन और उन्हें एक ही DLL के खिलाफ लिंक (मैं जानता हूँ कि मैं भी मानक पुस्तकालय जहाज के लिए की जरूरत है;।। मेरी योजना DLL फ़ाइल को ज़िपित संग्रह संलग्न करने के लिए था जहां तक ​​मैं समझता हूँ , मैं इसके द्वारा शुद्ध पायथन मॉड्यूल आयात करने में भी सक्षम हूं।)

मुझे dynload_win.c में एक दिलचस्प जगह भी मिली। (मैं समझता हूँ कि यह गतिशील एक्सटेंशन का उपयोग करने वाले अजगर सी एपीआई, जैसे _ctypes लोड करता है।) जहां तक ​​मैं देख सकता हूँ यह न केवल init_ctypes प्रतीक या जो कुछ भी विस्तार का नाम है के लिए लग रहा है, लेकिन यह भी .pyd फ़ाइल के आयात तालिका स्कैन करती है (regex) के लिए python\d+\. और उसके बाद ज्ञात प्रतीक की तुलना pythonNN. स्ट्रिंग के साथ की जाती है ताकि यह सुनिश्चित किया जा सके कि एक्सटेंशन को पायथन के इस संस्करण के लिए संकलित किया गया हो। अगर आयात तालिका में ऐसा प्रतीक नहीं है या यह किसी अन्य संस्करण को संदर्भित करता है, तो यह एक त्रुटि उठाता है।

मेरे लिए इसका मतलब है कि:

  • अगर मैं pythonNN.dll के खिलाफ एक विस्तार लिंक और है कि एक स्थिर जुड़ा हुआ अजगर शामिल अपने कस्टम DLL से यह लोड करने का प्रयास है, यह जाँच में सफल होगा, लेकिन - यहाँ अच्छी तरह से, मुझे यकीन नहीं है: क्या यह असफल हो जाएगा क्योंकि pythonNN.dll (यानी चेक करने से पहले भी) या यह खुशी से प्रतीकों को लोड करेगा?
  • और अगर मैं इसे अपने कस्टम DLL के खिलाफ लिंक, यह प्रतीकों मिलेगा, लेकिन जांच :)

मुझे लगता है कि मैं अपने आवश्यकताओं के अनुरूप इस टुकड़े को फिर से लिखने सकता है पारित नहीं होगा ... वहाँ किसी भी कर रहे हैं ऐसे अन्य स्थानों, मुझे आश्चर्य है।

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