जावा में पायथन कॉलिंग?


116

मुझे आश्चर्य हो रहा है कि क्या jython का उपयोग करके java code से python फ़ंक्शन को कॉल करना संभव है, या यह केवल python से java कोड को कॉल करने के लिए है?


3
कृपया इसी तरह के प्रश्न पर एक नज़र डालें और उत्तर पढ़ें। बाइट्स। एन्टॉपिक
एफ़थॉन/

जवाबों:


100

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);

मैंने JYthon स्थापित किया है, या मुझे लगता है कि मैंने किया था, और मैं उस कोड को चलाने की कोशिश कर रहा हूं जिसे आपने उल्लिखित किया था लेकिन यह एक गलती के रूप में उजागर हुआ। क्या अजगर की किस्त को एक विशिष्ट फ़ोल्डर में जाने की जरूरत है, या तो अजगर या जावा फ़ोल्डर में?
शहाब १

2
कोई त्रुटि नहीं है, मैं सिर्फ एक मुश्किल समय के लिए Netbeans में Jython को एकीकृत कर रहा हूँ
Shahab

यदि कोई त्रुटि नहीं है, तो यह काम करेगा, इसलिए यह स्पष्ट रूप से नहीं है;) "त्रुटि" का अर्थ रनटाइम त्रुटि नहीं है, साथ ही एक संकलन त्रुटि भी हो सकती है।
वू

मेरा बुरा, यह शब्द का एक गरीब उपयोग था। मैं अपनी परियोजना और netbeans में jython.jar को जोड़ने की कोशिश कर रहा था। मैंने यह पता लगा लिया
शहाब

1
लाइफ का पायथन 2 एंड 1.1.2020 है और जाइथन केवल पायथन 2.7 का समर्थन करता है। इसलिए कोई ज्योनत मूल रूप से मरा नहीं है। सबसे अच्छा (सबसे सरल) विकल्प Jep lib
garyee

63

अरे मैंने सोचा कि मैं इसके उत्तर में प्रवेश करूंगा, भले ही इसकी देर हो। मुझे लगता है कि जावा और अजगर के बीच संबंध जोड़ने की आपकी इच्छा कितनी प्रबल है, इस पर पहले विचार करना जरूरी है।

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

दूसरी बात यह है कि हम 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 / शामिल करें, बढ़ावा दें और केवल साझा पुस्तकालयों (डीएलएस) का उपयोग करें अन्यथा बढ़ावा में एक फाड़ है। और हाँ, मुझे पता है। ऐसे कई तरीके हैं जिनसे यह खट्टा हो सकता है। इसलिए सुनिश्चित करें कि आप प्रत्येक चीज़ को ब्लॉक करके पूरा कर लें। फिर उन्हें एक साथ रखा।


2
यहां एक लाइब्रेरी जो आपको एक बार अपनी अजगर लिपियों को लिखने देती है और यह तय करती है कि रनटाइम के समय कौन सी एकीकरण पद्धति (Jython, CPython via Jep and Py4j) का उपयोग करें: github.com/subes/invesdwin-confxt-python चूंकि प्रत्येक विधि के अपने लाभ / कमियां हैं।
उप

@subes कि परियोजना भयानक लग रहा है मैंने यह कुछ समय पहले लिखा था। मैं आपको एक उत्तर लिखने के लिए प्रोत्साहित करता हूं जो मैं इसे बढ़ाऊंगा। मैं शीर्ष उत्तर को नापसंद करता हूं क्योंकि मुझे नहीं लगता कि यह एक Google खोज के बाहर बहुत उपयोगी जानकारी प्रदान करता है।
स्निकर्स 3192

मैंने एक अलग उत्तर बनाया
उप

3
क्या यह उत्तर "यह स्वीकार किया गया उत्तर होना चाहिए" या यह सिर्फ मुझे है? ;-)
मॉरीशियो ग्रेसिया

18

जावा के अंदर अजगर कोड होना स्मार्ट नहीं है। अपने माइक्रोफ़ोन के रूप में बनाने के लिए फ्लास्क या अन्य वेब ढांचे के साथ अपने अजगर कोड को लपेटें। अपने जावा प्रोग्राम को इस माइक्रोसर्विस (जैसे REST के माध्यम से) को कॉल करने में सक्षम बनाएं।

मुझे निहारना, यह बहुत सरल है और आपको कई टन मुद्दों को बचाएगा। और कोड शिथिल युग्मित हैं इसलिए वे स्केलेबल हैं।

24 मार्च 2020 को अपडेट किया गया: @ stx की टिप्पणी के अनुसार, क्लाइंट और सर्वर के बीच बड़े पैमाने पर डेटा ट्रांसफर के लिए उपरोक्त दृष्टिकोण उपयुक्त नहीं है। यहाँ एक और दृष्टिकोण है जिसकी मैंने सिफारिश की थी: पायथन और जावा को रस्ट से जोड़ना (C / C ++ भी ठीक है)। https://medium.com/@shmulikamar/https-medium-com-shmulikamar-connecting-python-and-java-with-rust-11c256a1dfb0


+1, लेकिन दोनों सिरों पर आगे और पीछे संदेश बनाने और अतिरिक्त प्रदर्शन और संचार के बारे में क्या?
stx

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

10

कई जवाबों में उल्लेख किया गया है कि आप cpython तक पहुँचने के लिए JNI या JNA का उपयोग कर सकते हैं, लेकिन मैं स्क्रैच से शुरू करने की सलाह नहीं दूंगा क्योंकि जावा से cpython तक पहुँचने के लिए पहले से ही ओपन सोर्स लाइब्रेरी हैं। उदाहरण के लिए:


8

यहां एक पुस्तकालय जो आपको एक बार अपनी अजगर लिपियों को लिखने देता है और यह तय करता है कि रनिंग के समय कौन सी एकीकरण पद्धति (Jython, CPython / PyPy via Jep and Py4j) का उपयोग करें:

https://github.com/subes/invesdwin-context-python

चूंकि लिंक में बताए अनुसार प्रत्येक विधि के अपने फायदे / कमियां हैं।


इस परियोजना का कोई रिलीज नहीं है।
क्रिश्चियन शालिचर्ले

@ChristianSchlichtherle invesdwin-reference-python संस्करण 1.0.0 उपलब्ध नहीं है; इस छोटे से रत्न के लिए धन्यवाद: github.com/loewenfels/dep-graph-releaser
सबस

6

यह इस बात पर निर्भर करता है कि आप अजगर के कार्यों से क्या मतलब रखते हैं? अगर वे cpython में लिखे गए थे, तो आप सीधे उन्हें कॉल नहीं कर सकते हैं आपको JNI का उपयोग करना होगा , लेकिन अगर वे Jython में लिखे गए थे आप उन्हें आसानी से जावा से कॉल कर सकते हैं, क्योंकि jython अंततः java बाइट कोड उत्पन्न करता है।

अब जब मैं कहती हूं कि यह cpython या jython में लिखा है तो इसका कोई मतलब नहीं है क्योंकि python python है और अधिकांश कोड दोनों कार्यान्वयन पर चलेंगे जब तक कि आप विशिष्ट पुस्तकालयों का उपयोग नहीं कर रहे हैं जो कि cpython या java पर निर्भर हैं।

जावा में पायथन इंटरप्रेटर का उपयोग कैसे करें, यहां देखें


5

आपकी आवश्यकताओं के आधार पर, XML-RPC जैसे विकल्प उपयोगी हो सकते हैं, जो प्रोटोकॉल का समर्थन करने वाली किसी भी भाषा में कॉल फ़ंक्शन को दूरस्थ रूप से उपयोग करने के लिए उपयोग किया जा सकता है।


5

GraalVM एक अच्छा विकल्प है। मैंने microservice डिजाइन के लिए GraalVM के साथ जावा + जावास्क्रिप्ट संयोजन (जावास्क्रिप्ट प्रतिबिंब के साथ जावा) किया है। उन्होंने हाल ही में अजगर के लिए समर्थन जोड़ा, मैं इसे विशेष रूप से कोशिश करूँगा कि इसका समुदाय वर्षों में कितना बड़ा हो गया है।


4

जावा नेटिव इंटरफ़ेस का उपयोग करके आप जावा से किसी भी भाषा को कॉल कर सकते हैं


6
कोई भी भाषा जिसे स्वयं c से कहा जा सकता है। खैर ठीक है अजगर, लेकिन वास्तव में Jython एक बहुत सरल समाधान है (या j6 + में PyInterpreter का उपयोग करके)। यह नहीं है कि सी से अजगर कार्यों को कॉल करने के लिए कोड लिखने के लिए तुच्छ है।
वू

2

Jython की कुछ सीमाएँ हैं:

कई मतभेद हैं। सबसे पहले, Jython प्रोग्राम, C में लिखे गए CPython एक्सटेंशन मॉड्यूल का उपयोग नहीं कर सकते हैं। इन मॉड्यूल में आमतौर पर एक्सटेंशन .so, .pyd या ordll के साथ फाइलें होती हैं। यदि आप ऐसे मॉड्यूल का उपयोग करना चाहते हैं, तो आपको शुद्ध पायथन या जावा में लिखे गए समकक्ष की तलाश करनी चाहिए। यद्यपि यह इस तरह के विस्तार का समर्थन करने के लिए तकनीकी रूप से संभव है - आयरनपिथॉन ऐसा करता है - ज्योनन में ऐसा करने की कोई योजना नहीं है।

Jython के साथ JAR फ़ाइलों के रूप में मेरी पायथन लिपियों का वितरण?

आप बस रनटाइम या प्रोसेसब्यूरी का उपयोग करके जावा से अजगर लिपियों (या बैश या पर्ल स्क्रिप्ट) को कॉल कर सकते हैं और आउटपुट को जावा में वापस भेज सकते हैं:

जावा में बैश शेल स्क्रिप्ट चल रहा है

जावा में कमांड लाइन चलाना

java runtime.getruntime () कमांड लाइन प्रोग्राम निष्पादित करने से आउटपुट मिलता है


0

यह वर्तमान विकल्पों पर बहुत अच्छा अवलोकन देता है। जिनमें से कुछ का नाम अन्य उत्तरों में दिया गया है। जब तक वे पायथन 3.x को लागू करने का निर्णय नहीं लेते हैं तब तक जाइथन प्रयोग करने योग्य नहीं है और कई अन्य परियोजनाएं अजगर पक्ष बन रही हैं और जावा का उपयोग करना चाहती हैं। लेकिन अभी भी कुछ विकल्प हैं, कुछ का नाम रखने के लिए जो अभी तक नाम नहीं दिया गया है: gRPC

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.