2009-07-13 17 views
40

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

ऐसा करने का सबसे अच्छा तरीका किसी भी विचार की सराहना की जाएगी। धन्यवाद।

+1

यदि पाइथन पुस्तकालय शुद्ध पायथन में लिखा गया है, तो ज्योथन का उपयोग करने के बारे में क्या? – fabrizioM

उत्तर

28

Jython का उपयोग क्यों नहीं करें? एकमात्र नकारात्मक पक्ष मैं तुरंत सोच सकता हूं कि यदि आपकी लाइब्रेरी सीपीथन मूल एक्सटेंशन का उपयोग करती है।

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

+0

मैंने ज्योथन पुस्तकालयों को देखा है। समस्या यह है कि मुझे कोई गारंटी नहीं है कि जिन पुस्तकालयों का मैं उपयोग कर रहा हूं वे मूल एक्सटेंशन का उपयोग नहीं करते हैं (या भविष्य में नहीं)। –

+0

मैं यह करूँगा। धन्यवाद। क्या मुझे ज्योथन के साथ चलाने के लिए एक पीई फ़ाइल में विशेष कुछ जोड़ने की ज़रूरत है? या यदि यह देशी पायथन है, तो क्या यह अभी चलाना चाहिए? –

+0

मुझे ज्योथन के साथ ज्यादा अनुभव नहीं है - दस्तावेज़ों से परामर्श लें :) –

4

क्या आपने जावा वीएम पर Jython चलाने पर विचार किया है?

+0

आयरनपीथन .NET के लिए है, जावा नहीं। IKVM तीन संभावित रूप से एकजुट हो सकता है, लेकिन ick :) –

+0

हां, मेरे तारों को पार कर गया। – cletus

+1

क्या मुझे आयरनपीथन के संदर्भ में कहीं और याद आया है? –

4

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

13

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

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

आरपीसी करने के वैकल्पिक तरीके पर विचार करने के लिए कम लोकप्रिय लेकिन Google प्रोटोबफर्स ​​है, जिसमें nice rpc के लिए 2/3 समर्थन है। आपको बस अपनी परिवहन परत प्रदान करने की आवश्यकता है। इतना काम नहीं है और लेखन की सुविधा उचित है।

एक और विकल्प है कि पाइथन कार्यक्षमता के उन टुकड़ों के चारों ओर एक सी रैपर लिखना है जिसे आपको जावा के सामने आने और JVM देशी प्लगइन के माध्यम से इसका उपयोग करने की आवश्यकता है। आप SWIG SWIG के साथ जाकर दर्द को कम कर सकते हैं।

अनिवार्य रूप से अपने मामले में ऐसा काम करता है:

  1. एक बड़ा घूँट इंटरफ़ेस बनाएँ सभी विधि के लिए जावा से सेल्सियस तक ++ कहता है।
  2. सी/सी ++ कोड बनाएं जो आपकी कॉल प्राप्त करेगा और आंतरिक रूप से सही पैराम के साथ पाइथन दुभाषिया को कॉल करेगा।
  3. आपको पाइथन से प्राप्त प्रतिक्रिया को बदलें और इसे अपने जावा कोड पर वापस स्विग के माध्यम से भेजें।

यह समाधान काफी जटिल है, ज्यादातर मामलों में एक ओवरकिल है। फिर भी यदि आप (किसी कारण से) आरपीसी बर्दाश्त नहीं कर सकते हैं तो यह करने योग्य है। आरपीसी अभी भी मेरी पसंदीदा पसंद होगी, हालांकि।

+5

यह गैर-जेवीएम संगतता पायथन की सबसे बड़ी कमी है। Thats क्यों हम Scala का उपयोग करने का फैसला किया। यह भी बेहतर है। – Jus12

+0

मार्किन, दूरस्थ कॉल तरीका प्रदर्शन और स्केलेबिलिटी कारणों के लिए बड़े डेटा कार्यान्वयन (एल्गोरिदम या एप्लिकेशन) के लिए इच्छित नहीं है। वास्तव में "काफी अनुकूल नहीं" एक मुद्दा है लेकिन "गुप्त जेवीएम स्टैकट्रैक के साथ तोड़ने" के लिए कुछ स्पष्टीकरण और उदाहरणों की आवश्यकता है। आप डीबग करना या चलाने के लिए मुश्किल मतलब है? मैं जेप की कोशिश कर रहा हूं जो जेएनआई प्रक्रिया में करता है और सबसे अच्छी चीज की तरह लगता है। https://github.com/mrj0/jep/wiki/How-Jep-Works। विचार? – SemanticBeeng

7

मेरा दूसरा विचार जेएनआई का उपयोग पायथन के लिए सी बाइंडिंग के साथ संवाद करने के लिए करना है।

मैं बहुत ज्यादा JNA चाहते:

JNA जावा कार्यक्रमों कुछ भी लेकिन जावा कोड-कोई JNI या मूल कोड की आवश्यकता है लेखन के बिना देशी साझा पुस्तकालयों (Windows पर DLLs) तक आसानी से पहुँचा जा सकता है। यह कार्यक्षमता विंडोज 'प्लेटफार्म/इनवोक और पायथन के प्रकार के तुलनीय है। बिना कोड पीढ़ी के रनटाइम पर एक्सेस गतिशील है।

मेरे 0.02 $ :)

4

कई साल बाद, सिर्फ एक विकल्प है जो और अधिक लोकप्रिय इन दिनों है ...

जोड़ने के लिए आप CPython कार्यक्षमता की जरूरत है, py4j एक अच्छा विकल्प है । py4j ने 2017 में लगातार अपडेट देखा है और इसे कुछ लोकप्रियता मिली है, क्योंकि इसका उपयोग किया जाता है उदा। CPython interoperability प्राप्त करने के लिए अपाचे स्पार्क द्वारा।

+1

यह ज्योथन की तुलना में वास्तव में एक बेहतर विकल्प है, जो एक तकनीकी मृत अंत है और अब इसे बनाए रखा प्रतीत नहीं होता है। –

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