c++ - गैर-अजगर अनुप्रयोग में पाइथन स्क्रिप्टिंग जोड़ने का "सही" तरीका





python scripting plugins desktop-application (4)


मुझे पाइथन को एम्बेड करने में समस्या नहीं दिखाई देती है, उदाहरण के लिए, बूस्ट.पथन। आप जो भी मांगते हैं वह आपको मिलेगा:

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

मेरा मतलब है, आपको अभी भी एक एपीआई का पर्दाफाश करना और कार्यान्वित करना होगा, लेकिन 1) यह एक अच्छी बात है, 2) ब्लेंडर यह भी करता है और 3) मैं वास्तव में किसी अन्य तरीके से नहीं सोच सकता जो आपको इस काम से लाभ पहुंचाता है .. ।

पीएस: मुझे पाइथन / बूस्ट के साथ थोड़ा सा अनुभव है। पायथन लेकिन लुआ / लुआबिंद के साथ बड़े पैमाने पर काम किया है, जो कि थोड़े समान है

मैं वर्तमान में उपयोगकर्ताओं के लिए पाइथन में लिखे गए प्लगइन का उपयोग करके अपने डेस्कटॉप एप्लिकेशन (सी ++) की कार्यक्षमता बढ़ाने की क्षमता जोड़ने की प्रक्रिया में हूं।

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

तथापि...

जो मैं खोज रहा हूं वह Blender तरह अधिक है। ब्लेंडर पायथन स्क्रिप्ट के माध्यम से पूरी तरह से अनुकूलन योग्य है, और इसके लिए बाहरी पायथन निष्पादन योग्य की आवश्यकता होती है। (यानी पायथन वास्तव में ब्लेंडर निष्पादन योग्य में बिल्कुल एम्बेडेड नहीं है।) इसलिए, स्वाभाविक रूप से, आप ब्लेंडर स्क्रिप्ट लिखते समय अपनी साइट-पैकेज निर्देशिका में पहले से मौजूद किसी भी मॉड्यूल को शामिल कर सकते हैं। ऐसा नहीं है कि इसकी सलाह दी जाती है, क्योंकि इससे आपकी स्क्रिप्ट की पोर्टेबिलिटी सीमित हो जाएगी।

तो, मैं क्या जानना चाहता हूं कि अगर आपका केक रखने और इसे भी खाने का कोई तरीका है। मुझे एक प्लगइन सिस्टम चाहिए जो उपयोग करता है:

  • एक एम्बेडेड पायथन दुभाषिया।

    ब्लेंडर के दृष्टिकोण का नकारात्मक पक्ष यह है कि यह आपको अपने सिस्टम पर विश्व स्तर पर स्थापित पायथन का विशिष्ट, संभवतः पुराना संस्करण रखने के लिए मजबूर करता है। एक एम्बेडेड दुभाषिया होने से मुझे यह नियंत्रित करने की अनुमति मिलती है कि पाइथन का किस संस्करण का उपयोग किया जा रहा है।

  • फ़ायरवॉल प्लगइन्स।

    प्रत्येक प्लगइन के लिए virtualenv कुछ समकक्ष; उन्हें उन सभी मॉड्यूल को स्थापित करने की इजाजत दी जाती है जिन्हें वे चाहते हैं या चाहते हैं, लेकिन उन्हें अन्य प्लगइन में संभावित संघर्षों से अलग रखना। शायद zc.buildout यहां एक बेहतर उम्मीदवार है, लेकिन, फिर से, मैं सुझाव के लिए बहुत खुला हूं। मैं इसे पूरा करने के सर्वोत्तम तरीके के रूप में एक नुकसान में थोड़ा सा हूँ।

  • जितना संभव हो दर्द रहित ...

    उपयोगकर्ता के लिए मैं अतिरिक्त मील जाने के लिए तैयार हूं, बस इतना ही समय तक कि अधिकांश उपरोक्त प्लगइन लेखक के रूप में संभव है।

यदि आप में से कोई भी इस तरह की चीज़ों के साथ कोई अनुभव अनुभव करता है, तो आपकी मदद की बहुत सराहना की जाएगी। :)

संपादित करें: असल में, जो मैं चाहता हूं उसका छोटा संस्करण virtualenv की सादगी है, लेकिन बंडल पायथन दुभाषिया के बिना, और एक विशिष्ट "वर्चुअल वातावरण" को प्रोग्रामेटिक रूप से सक्रिय करने का एक तरीका, जैसे zc.buildout sys.path मैनिपुलेशन के साथ करता है ( sys.path[0:0] = [...] चाल)।

zc.buildout और zc.buildout दोनों में जो कुछ भी मैं चाहता हूं उसके भाग होते हैं, लेकिन न तो zc.buildout बनाता है I, या एक प्लगइन डेवलपर बस ज़िप कर सकता है और किसी अन्य कंप्यूटर को भेज सकता है।

बस .pth फ़ाइलों में हेरफेर करना, या सीधे एक स्क्रिप्ट में sys.path में हेरफेर sys.path , मेरे आवेदन से निष्पादित मुझे आधा रास्ता मिल जाता है। लेकिन यह पर्याप्त नहीं है जब संकलित मॉड्यूल आवश्यक हैं, जैसे कि पीआईएल।




यदि आप वास्तव में आपके और आपके उपयोगकर्ताओं के लिए जितना संभव हो सके दर्द रहित होना चाहते हैं, तो एम्बेडिंग के बजाए पायथन को विस्तारित करने पर विचार करें।

  • एम्बेडिंग अन्य सॉफ़्टवेयर के साथ आसान एकीकरण की अनुमति नहीं देती है - केवल एक प्रोग्राम जो पाइथन को एम्बेड करता है उसे एक पायथन स्क्रिप्ट द्वारा एक बार उपयोग किया जा सकता है। ओटीओएच विस्तार का मतलब है कि उपयोगकर्ता आपके सॉफ़्टवेयर का उपयोग कहीं भी पाइथन रन कर सकता है;
  • स्क्रिप्ट लेखक के लिए सामान उपलब्ध कराने के लिए, आपको एक दुभाषिया प्रारंभ करने की आवश्यकता नहीं है। दुभाषिया आपके लिए पहले ही शुरू हो जाएगा, आपको काम बचाएगा।
  • आपको अपने एम्बेडेड दुभाषिया में इंजेक्ट करने के लिए विशेष अंतर्निर्मित चर और नकली मॉड्यूल बनाने की आवश्यकता नहीं है। बस उन्हें एक वास्तविक एक्सटेंशन मॉड्यूल दें, और जब आप अपना मॉड्यूल पहली बार आयात करते हैं तो आप सबकुछ आरंभ कर सकते हैं।
  • आप अपने सॉफ़्टवेयर को वितरित करने के लिए distutils का उपयोग कर सकते हैं
  • वर्चुअलएन्व जैसे टूल्स का उपयोग किया जा सकता है - आप या उपयोगकर्ता को नए टूल्स के साथ आने की ज़रूरत नहीं है। आपका उपयोगकर्ता अपनी आईडीई / डीबग टूल / पसंद के परीक्षण ढांचे का भी उपयोग कर सकता है

एम्बेडिंग वास्तव में आपके और आपके उपयोगकर्ताओं को कुछ भी नहीं खरीदती है।




इसे पूरा करने का एक प्रभावी तरीका संदेश-पासिंग / संचार प्रक्रियाओं का उपयोग करना है, जिससे आप पाइथन के साथ अपना लक्ष्य पूरा कर सकते हैं, लेकिन खुद को पायथन तक सीमित नहीं कर सकते हैं।

------------------------------------
| App  <--> Ext. API <--> Protocol | <--> (Socket) <--> API.py <--> Script
------------------------------------

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

अपने एप्लिकेशन के बाहरी एपीआई को परिभाषित करें

आपके एप्लिकेशन का बाहरी एपीआई उन सभी कार्यों का वर्णन करता है जो बाहरी प्रक्रिया के साथ बातचीत करने में सक्षम होना चाहिए। उदाहरण के लिए, यदि आप अपनी पायथन स्क्रिप्ट को अपने एप्लिकेशन में लाल सर्कल बनाने में सक्षम होना चाहते हैं, तो आपके बाहरी एपीआई में ड्रा (ऑब्जेक्ट, रंग, स्थिति) शामिल हो सकता है।

एक संचार प्रोटोकॉल परिभाषित करें

यह प्रोटोकॉल है कि बाहरी प्रक्रियाएं आपके बाहरी एपीआई के माध्यम से आपके एप्लिकेशन के साथ संवाद करने के लिए उपयोग करती हैं। इसके लिए लोकप्रिय विकल्प एक्सएमएल-आरपीसी, सनआरपीसी, जेएसओएन, या अपने स्वयं के कस्टम प्रोटोकॉल और डेटा प्रारूप हो सकते हैं। यहां आपके विकल्प को आपके एपीआई के लिए पर्याप्त होना चाहिए। उदाहरण के लिए, यदि आप बाइनरी डेटा स्थानांतरित करने जा रहे हैं तो JSON को बेस 64 एन्कोडिंग की आवश्यकता हो सकती है, जबकि सनआरपीसी बाइनरी संचार मानता है।

अपने एप्लिकेशन की संदेश प्रणाली बनाएं

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

पायथन के लिए एक संदेश पुस्तकालय बनाएँ (या जो कुछ भी)

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

उदाहरण के लिए यूनिक्स सॉकेट का उपयोग करना बेहद तेज़ होगा।

प्लगइन / आवेदन Rendezvous

एप्लिकेशन प्लगइन्स की खोज के लिए एक सामान्य अभ्यास एक "अच्छी तरह से ज्ञात" निर्देशिका निर्दिष्ट करना है जहां प्लगइन्स रखा जाना चाहिए। यह हो सकता है, उदाहरण के लिए:

~/.myapp/plugins

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

आइए मान लें कि आपका संचार प्रोटोकॉल निर्दिष्ट करता है कि प्रत्येक स्क्रिप्ट STDInput / StdOuput पर JSON का उपयोग करके संवाद करेगी। एक सरल, प्रभावी तरीका आपके प्रोटोकॉल में निर्दिष्ट करना है कि पहली बार एक स्क्रिप्ट चलती है, यह मानक रूप से एक मैजिक_आईडी भेजती है। यही है, आपका एप्लिकेशन पहले, कहता है, 8 बाइट्स पढ़ता है, और एक विशिष्ट 64-बिट मान की तलाश करता है जो इसे स्क्रिप्ट के रूप में पहचानता है।

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




यदि आप मैक पर हैं तो आप .app बंडल बनाने के लिए py2app का उपयोग कर सकते हैं, जो आपके डीजेंगो ऐप को शुरू करते हैं, जब आप उस पर डबल-क्लिक करते हैं।

मैं वर्णित करता हूं कि https://angoosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html पर इस तरह के एक बंडल में जेंजो और चेरीपैली को कैसे बांधाएं

लेख में मैं एक स्थानीय अनुप्रयोग विंडो में अपनी Django साइट को प्रदर्शित करने के लिए pywebview का उपयोग करता हूं।





c++ python scripting plugins desktop-application