जवाबों:
Jython: जावा प्लेटफ़ॉर्म के लिए पायथन - http://www.jython.org/index.html
आप आसानी से जावा कोड से अजगर कार्यों को जाइथन के साथ कह सकते हैं। यह तब तक है जब तक कि आपका अजगर कोड खुद jython के तहत चलता है, यानी कुछ ऐसे c- एक्सटेंशन का उपयोग नहीं करता है जो समर्थित नहीं हैं।
अगर वह आपके लिए काम करता है, तो यह निश्चित रूप से सबसे सरल समाधान है जिसे आप प्राप्त कर सकते हैं। अन्यथा आप उपयोग कर सकते हैंorg.python.util.PythonInterpreter
नए Java6 दुभाषिया समर्थन से ।
मेरे सिर के ऊपर से एक सरल उदाहरण - लेकिन मुझे आशा है कि काम करना चाहिए: (संक्षिप्तता के लिए कोई त्रुटि जाँच नहीं)
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys\nsys.path.append('pathToModules if they are not there by default')\nimport yourModule");
// execute a function that takes a string and returns a string
PyObject someFunc = interpreter.get("funcName");
PyObject result = someFunc.__call__(new PyString("Test!"));
String realResult = (String) result.__tojava__(String.class);
अरे मैंने सोचा कि मैं इसके उत्तर में प्रवेश करूंगा, भले ही इसकी देर हो। मुझे लगता है कि जावा और अजगर के बीच संबंध जोड़ने की आपकी इच्छा कितनी प्रबल है, इस पर पहले विचार करना जरूरी है।
पहले तो क्या आप केवल फ़ंक्शन को कॉल करना चाहते हैं या आप वास्तव में अपने जावा ऑब्जेक्ट में डेटा को बदलने के लिए अजगर कोड चाहते हैं? यह बहुत महत्वपूर्ण है। यदि आप केवल कुछ अजगर कोड को तर्कों के साथ या बिना कॉल करना चाहते हैं, तो यह बहुत मुश्किल नहीं है। यदि आपकी दलीलें आदिम हैं तो यह और भी आसान बना देती है। हालाँकि यदि आप अजगर में जावा क्लास के सदस्य कार्यों को लागू करना चाहते हैं, जो जावा ऑब्जेक्ट के डेटा को बदलते हैं, तो यह इतना आसान या सीधे आगे नहीं है।
दूसरी बात यह है कि हम cpython बात कर रहे हैं या jython करेंगे? मैं कहूँगा कि cpython कहाँ पर है! मैं इस बात की वकालत करूंगा कि अजगर इतना कूल क्यों है! इस तरह के उच्च अमूर्त होने पर, आवश्यकता होने पर c, c ++ तक पहुंच होती है। कल्पना करें कि क्या आप जावा में हो सकते हैं। यह सवाल पूछने लायक भी नहीं है कि क्या jython ठीक है क्योंकि तब यह आसान है।
इसलिए मैंने निम्नलिखित विधियों के साथ खेला है, और उन्हें आसान से कठिन में सूचीबद्ध किया है:
जावा से जेथॉन
लाभ: सामान्य रूप से आसान। जावा वस्तुओं के वास्तविक संदर्भ हैं
नुकसान: कोई CPython, बहुत धीमा!
जावा से जथन इतना आसान है, और अगर यह वास्तव में पर्याप्त है तो महान है। हालाँकि यह बहुत धीमा है और कोई खौफनाक नहीं है! क्या जीवन बिना खौफ के जीने लायक है मुझे नहीं लगता! आप आसानी से अजगर वस्तुओं के लिए अपने सदस्य कार्यों को लागू करने वाले अजगर कोड हो सकते हैं।
पाइरो के माध्यम से जाइथन से सीपीथॉन तक जावा
अजगर अजगर के लिए दूरस्थ वस्तु मॉड्यूल है। आपके पास एक cpython दुभाषिया पर कुछ ऑब्जेक्ट है, और आप इसे ऑब्जेक्ट भेज सकते हैं जो क्रमांकन के माध्यम से स्थानांतरित किए जाते हैं और यह इस विधि के माध्यम से ऑब्जेक्ट भी वापस कर सकते हैं। ध्यान दें कि यदि आप jython से एक अनुक्रमित अजगर ऑब्जेक्ट भेजते हैं और फिर कुछ फ़ंक्शन कॉल करते हैं जो डेटा को उसके सदस्यों में बदलते हैं, तो आप जावा में उन परिवर्तनों को नहीं देखेंगे। आपको बस उस डेटा को वापस भेजने के लिए याद रखने की ज़रूरत है जो आप पायरो से चाहते हैं। यह मेरा मानना है कि cpython पाने का सबसे आसान तरीका है! आपको किसी jni या jna या swig या की आवश्यकता नहीं है .... आपको किसी भी c, या c ++ को जानने की आवश्यकता नहीं है। कूल हुह?
फ़ायदे: cpython तक पहुँचना, निम्न विधियों की तरह कठिन नहीं है
नुकसान: अजगर वस्तुओं के सदस्य डेटा को सीधे अजगर से नहीं बदल सकते। कुछ हद तक अप्रत्यक्ष है, (जेथॉन मध्यम पुरुष है)।
जावा सीएन / सी ++ के माध्यम से जेएनआई / जेएनए / एसडब्ल्यूआईजी के माध्यम से पायथन से एंबेडेड इंटरप्रेटर (शायद किताबें पुस्तकालयों का उपयोग करके?)।
OMG यह विधि दिल के बेहोश होने के लिए नहीं है। और मैं आपको बता सकता हूं कि एक सभ्य विधि के साथ इसे हासिल करने में मुझे बहुत लंबा समय लगा है। मुख्य कारण आप ऐसा करना चाहते हैं, ताकि आप cpython कोड चला सकें, जो कि java object पर पूर्ण रूप से प्रबल हो। अजवायन (जो एक घोड़े की तरह है) के साथ रोटी और जोवा (जो कि एक चिंप की तरह है) का फैसला करने से पहले विचार करने वाली प्रमुख प्रमुख बातें हैं। सबसे पहले यदि आप दुभाषिया को क्रैश करते हैं जो आपके कार्यक्रम के लिए रोशनी करता है! और मुझे समसामयिक मुद्दों पर शुरू मत करो! इसके अलावा, बायलर का अलॉट अलॉट है, मेरा मानना है कि मुझे इस बायलर को कम से कम करने के लिए सबसे अच्छा कॉन्फ़िगरेशन मिला है लेकिन फिर भी यह एलॉट है! तो इस बारे में कैसे जाना है: विचार करें कि C ++ आपका मध्य पुरुष है, आपकी वस्तुएं वास्तव में c ++ ऑब्जेक्ट हैं! अच्छा है कि आप जानते हैं कि अब। बस अपने ऑब्जेक्ट को लिखें जैसे कि आपका प्रोग्राम cpp नहीं जावा में, उस डेटा के साथ जिसे आप दोनों दुनिया से एक्सेस करना चाहते हैं। फिर आप swig नामक रैपर जनरेटर का उपयोग कर सकते हैं (http://www.swig.org/Doc1.3/Java.html ) java के लिए यह सुलभ बनाने के लिए और एक dll को संकलित करें जिसे आप java में System.load (यहाँ dll नाम) कहते हैं। पहले यह काम कर लें, फिर कठिन भाग पर आगे बढ़ें! अजगर को पाने के लिए आपको एक दुभाषिए को एम्बेड करना होगा। सबसे पहले मैं सुझाव देता हूं कि कुछ हेलो दुभाषिया कार्यक्रम या इस ट्यूटोरियल एंबेडिंग पायथन को सी / सी में करें । एक बार जब आप उस काम कर रहे हैं, तो घोड़े और बंदर को नृत्य करने का समय! आप [बढ़ावा देने] [3] के माध्यम से अजगर को c ++ ऑब्जेक्ट भेज सकते हैं। मुझे पता है कि मैंने आपको मछली नहीं दी है, केवल आपको बताया है कि मछली कहां मिलेगी। संकलन करते समय कुछ संकेत इसके लिए ध्यान दें।
जब आप बूस्ट कंपाइल करते हैं तो आपको एक साझा लाइब्रेरी संकलित करनी होगी। और आपको jdk, यानी jawt.lib, jvm.lib से अपनी ज़रूरत के सामान को शामिल करना और लिंक करना होगा, (आपको एप्लिकेशन लॉन्च करते समय अपने रास्ते में क्लाइंट jvm.dll की भी आवश्यकता होगी) साथ ही साथ python27.lib या जो कुछ भी और बूस्ट_पीथॉन- vc100-mt-1_55.lib। फिर अजगर शामिल करें / शामिल करें, jdk / शामिल करें, बढ़ावा दें और केवल साझा पुस्तकालयों (डीएलएस) का उपयोग करें अन्यथा बढ़ावा में एक फाड़ है। और हाँ, मुझे पता है। ऐसे कई तरीके हैं जिनसे यह खट्टा हो सकता है। इसलिए सुनिश्चित करें कि आप प्रत्येक चीज़ को ब्लॉक करके पूरा कर लें। फिर उन्हें एक साथ रखा।
जावा के अंदर अजगर कोड होना स्मार्ट नहीं है। अपने माइक्रोफ़ोन के रूप में बनाने के लिए फ्लास्क या अन्य वेब ढांचे के साथ अपने अजगर कोड को लपेटें। अपने जावा प्रोग्राम को इस माइक्रोसर्विस (जैसे REST के माध्यम से) को कॉल करने में सक्षम बनाएं।
मुझे निहारना, यह बहुत सरल है और आपको कई टन मुद्दों को बचाएगा। और कोड शिथिल युग्मित हैं इसलिए वे स्केलेबल हैं।
24 मार्च 2020 को अपडेट किया गया: @ stx की टिप्पणी के अनुसार, क्लाइंट और सर्वर के बीच बड़े पैमाने पर डेटा ट्रांसफर के लिए उपरोक्त दृष्टिकोण उपयुक्त नहीं है। यहाँ एक और दृष्टिकोण है जिसकी मैंने सिफारिश की थी: पायथन और जावा को रस्ट से जोड़ना (C / C ++ भी ठीक है)। https://medium.com/@shmulikamar/https-medium-com-shmulikamar-connecting-python-and-java-with-rust-11c256a1dfb0
यहां एक पुस्तकालय जो आपको एक बार अपनी अजगर लिपियों को लिखने देता है और यह तय करता है कि रनिंग के समय कौन सी एकीकरण पद्धति (Jython, CPython / PyPy via Jep and Py4j) का उपयोग करें:
https://github.com/subes/invesdwin-context-python
चूंकि लिंक में बताए अनुसार प्रत्येक विधि के अपने फायदे / कमियां हैं।
यह इस बात पर निर्भर करता है कि आप अजगर के कार्यों से क्या मतलब रखते हैं? अगर वे cpython में लिखे गए थे, तो आप सीधे उन्हें कॉल नहीं कर सकते हैं आपको JNI का उपयोग करना होगा , लेकिन अगर वे Jython में लिखे गए थे आप उन्हें आसानी से जावा से कॉल कर सकते हैं, क्योंकि jython अंततः java बाइट कोड उत्पन्न करता है।
अब जब मैं कहती हूं कि यह cpython या jython में लिखा है तो इसका कोई मतलब नहीं है क्योंकि python python है और अधिकांश कोड दोनों कार्यान्वयन पर चलेंगे जब तक कि आप विशिष्ट पुस्तकालयों का उपयोग नहीं कर रहे हैं जो कि cpython या java पर निर्भर हैं।
जावा में पायथन इंटरप्रेटर का उपयोग कैसे करें, यहां देखें ।
GraalVM एक अच्छा विकल्प है। मैंने microservice डिजाइन के लिए GraalVM के साथ जावा + जावास्क्रिप्ट संयोजन (जावास्क्रिप्ट प्रतिबिंब के साथ जावा) किया है। उन्होंने हाल ही में अजगर के लिए समर्थन जोड़ा, मैं इसे विशेष रूप से कोशिश करूँगा कि इसका समुदाय वर्षों में कितना बड़ा हो गया है।
जावा नेटिव इंटरफ़ेस का उपयोग करके आप जावा से किसी भी भाषा को कॉल कर सकते हैं
Jython की कुछ सीमाएँ हैं:
कई मतभेद हैं। सबसे पहले, Jython प्रोग्राम, C में लिखे गए CPython एक्सटेंशन मॉड्यूल का उपयोग नहीं कर सकते हैं। इन मॉड्यूल में आमतौर पर एक्सटेंशन .so, .pyd या ordll के साथ फाइलें होती हैं। यदि आप ऐसे मॉड्यूल का उपयोग करना चाहते हैं, तो आपको शुद्ध पायथन या जावा में लिखे गए समकक्ष की तलाश करनी चाहिए। यद्यपि यह इस तरह के विस्तार का समर्थन करने के लिए तकनीकी रूप से संभव है - आयरनपिथॉन ऐसा करता है - ज्योनन में ऐसा करने की कोई योजना नहीं है।
Jython के साथ JAR फ़ाइलों के रूप में मेरी पायथन लिपियों का वितरण?
आप बस रनटाइम या प्रोसेसब्यूरी का उपयोग करके जावा से अजगर लिपियों (या बैश या पर्ल स्क्रिप्ट) को कॉल कर सकते हैं और आउटपुट को जावा में वापस भेज सकते हैं:
जावा में बैश शेल स्क्रिप्ट चल रहा है
java runtime.getruntime () कमांड लाइन प्रोग्राम निष्पादित करने से आउटपुट मिलता है
यह वर्तमान विकल्पों पर बहुत अच्छा अवलोकन देता है। जिनमें से कुछ का नाम अन्य उत्तरों में दिया गया है। जब तक वे पायथन 3.x को लागू करने का निर्णय नहीं लेते हैं तब तक जाइथन प्रयोग करने योग्य नहीं है और कई अन्य परियोजनाएं अजगर पक्ष बन रही हैं और जावा का उपयोग करना चाहती हैं। लेकिन अभी भी कुछ विकल्प हैं, कुछ का नाम रखने के लिए जो अभी तक नाम नहीं दिया गया है: gRPC