পাইথন থেকে জাভা কল করা হচ্ছে


123

অজগর থেকে জাভা কল করার সর্বোত্তম উপায় কী? (জাইথন ​​এবং আরপিসি আমার পক্ষে কোনও বিকল্প নয়)।

আমি জিসিসির কথা শুনেছি: http://pypi.python.org/pypi/JCC/1.9 C ++ / পাইথন থেকে জাভা কল করার জন্য একটি সি ++ কোড জেনারেটর তবে এটি প্রতিটি সম্ভাব্য কল সংকলন প্রয়োজন; আমি অন্য একটি সমাধান পছন্দ করব।

আমি জেপাইপ সম্পর্কে শুনেছি: http://jpype.sourceforge.net/ টিউটোরিয়াল: http://www.slideshare.net/nyame/mixing-python-and- java

import jpype 
jpype.startJVM(path to jvm.dll, "-ea") 
javaPackage = jpype.JPackage("JavaPackageName") 
javaClass = javaPackage.JavaClassName 
javaObject = javaClass() 
javaObject.JavaMethodName() 
jpype.shutdownJVM() 

এটি আমার যা প্রয়োজন তা দেখে মনে হচ্ছে। তবে সর্বশেষ প্রকাশটি ২০০৯ সালের জানুয়ারী থেকে এবং আমি লোকেরা জাইপাইপ সংকলন করতে ব্যর্থ হতে দেখছি।

জেপাইপ কি কোনও মৃত প্রকল্প?

অন্য কোন বিকল্প আছে?

শুভেচ্ছা, ডেভিড


3
জেথন এবং আরপিসি আপনার পরিস্থিতির জন্য কেন বিকল্প নয় বলে আপনি বিশদটি বলতে পারেন?
নাথান ডেভিস

2
দেখে মনে হচ্ছে এর মধ্যেই একটি নতুন জেপাইপ প্রকাশ হয়েছে: ০.০.৪.২.২০১১-২০১৮
জোরিল

উত্তর:


51

এই সমস্যাটির আমার সংক্ষিপ্তসারটি এখানে: পাইথন থেকে জাভা কল করার 5 উপায়

http://baojie.org/blog/2014/06/16/call-java-from-python/ ( ক্যাশেড )

সংক্ষিপ্ত উত্তর: জাইপাইপ বেশ ভাল কাজ করে এবং অনেক প্রকল্পে প্রমাণিত হয় (যেমন পাইথন-বয়লারপাইপ) তবে পাইজনিয়াস জেপাইপের চেয়ে দ্রুত এবং সহজ

আমি পাইজনিয়াস / জিনিয়াস, জেসিসি, জাভাব্রিজ, জাইপাইপ এবং পাই 4 জে চেষ্টা করেছি।

পাই 4 জে ব্যবহার করা কিছুটা শক্ত, কারণ আপনাকে গেটওয়ে শুরু করতে হবে, ভঙ্গুরতার আরও একটি স্তর যুক্ত করা উচিত।


135

আপনি পাই 4 জে ব্যবহার করতে পারেন । প্রথম পৃষ্ঠায় এবং প্রচুর ডকুমেন্টেশনের একটি উদাহরণ রয়েছে, তবে মূলত, আপনি কেবলমাত্র আপনার পাইথন কোড থেকে জাভা পদ্ধতিগুলি কল করেন যেন সেগুলি পাইথন পদ্ধতি:

from py4j.java_gateway import JavaGateway
gateway = JavaGateway()                        # connect to the JVM
java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
other_object = java_object.doThat()
other_object.doThis(1,'abc')
gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method

জাইথনের বিপরীতে পাই 4 জনের একটি অংশ পাইথন ভিএম-তে চলে তাই এটি পাইথনের সর্বশেষতম সংস্করণ সহ সর্বদা "আপ টু ডেট" থাকে এবং আপনি লাইব্রেরি ব্যবহার করতে পারেন যা জাইথনের উপর ভাল চলমান না (যেমন, lxML)। অন্য অংশটি জাভা ভিএম-তে আপনি কল করতে চান runs

যোগাযোগটি জেএনআই এর পরিবর্তে সকেটের মাধ্যমে করা হয় এবং পাই 4 জে এর নিজস্ব প্রোটোকল রয়েছে (নির্দিষ্ট কিছু ক্ষেত্রে অনুকূলকরণ করতে, স্মৃতি পরিচালনা করতে ইত্যাদি)

দাবি অস্বীকার: আমি পাই 4 জির লেখক


লিঙ্কের জন্য ধন্যবাদ। এটি ডিজেএনএ যা প্রস্তাব করেছিল তার কোনও ওপেন-সোর্স বিকল্পের মতো দেখায়, কোডমেশ। আমি অবশ্যই এটি দেখতে হবে। তবে কোডমেশের মতো একই সমস্যা রয়েছে, এর আগে জাভা প্রক্রিয়াটি শুরু করা দরকার এবং পাইথন ব্যবহারের আগে এটি চলছে কিনা তা নিশ্চিত করা (প্রকল্পের মূল ওয়েবপৃষ্ঠায়, তালিকাপ্রিন্টার.জভা -> প্রধান -> গেটওয়ে সার্ভার.স্টার্টে উদাহরণ দেখুন) ))। এটি ব্যর্থতার সম্ভাব্য পয়েন্ট। আমি এখনও মনে করি যে জেপাইপের পদ্ধতিরটি দুর্দান্ত; এটি কেবল একটি মৃত প্রকল্প বলে মনে হচ্ছে।
ডেভিড পোর্টাবেলা

8
@ আলভাস আমি এখনও পাই 4 জেন বজায় রাখি যদি আপনি এর অর্থ বোঝাতে চেয়েছিলেন।
বার্থলেমি

@ বার্থলেমি, জাভা কোডটি যদি কোনও লাইব্রেরির উপর নির্ভর করে তবে কীভাবে একীকরণ করা যায় - আমার ক্ষেত্রে ওপেনসিভি?

1
@ স্ট্যাকটি কেবল আপনার ক্লাসপথে ওপেনসিভি যুক্ত করার বিষয়টি নিশ্চিত করুন এবং আপনি গেটওয়ে সার্ভার শুরু করার সময় আপনি পাইথন থেকে এটি অ্যাক্সেস করতে সক্ষম হবেন।
বার্থলেমি

এটি কি কোনও প্যাকেজের জন্য কাজ করে? আমি চেষ্টা করেছি: s = gateway.jvm.ch.ethz.ssh2.crypto.Base64() bt_out = s.decode();এখানে বেস 64 এর মেথড এনকোড () এবং ডিকোড () রয়েছে এবং এটি ch.ethz.ssh2.cryptoআমার .jar ফাইলে প্যাকেজের অংশ । আমি পেয়েছিfrom py4j.reflection import MethodInvoker ImportError: No module named reflection
বিশাল সাহু

19

Pyjnius।

দস্তাবেজ: http://pyjnius.readthedocs.org/en/latest/

গিথুব: https://github.com/kivy/pyjnius

গিথুব পৃষ্ঠা থেকে:

জেএনআই ব্যবহার করে পাইথন ক্লাস হিসাবে জাভা ক্লাসগুলি অ্যাক্সেস করার জন্য একটি পাইথন মডিউল।

পাইজেএনআইস একটি "ওয়ার্ক ইন প্রগ্রেস"।

সংক্ষিপ্ত বিবরণ

>>> from jnius import autoclass
>>> autoclass('java.lang.System').out.println('Hello world') Hello world

>>> Stack = autoclass('java.util.Stack')
>>> stack = Stack()
>>> stack.push('hello')
>>> stack.push('world')
>>> print stack.pop() world
>>> print stack.pop() hello

5

আমি ওএসএক্স ১০.১০.২ এ এসেছি এবং জেপাইপ ব্যবহার করে সফল হয়েছি।

জিনিয়াসের সাথে ইনস্টলেশন সমস্যার মধ্যে পড়ে ( অন্যদেরও রয়েছে ), জাভাব্রিজে ইনস্টল হয়েছে তবে আমি এটি ব্যবহার করার চেষ্টা করার সময় রহস্যজনক ত্রুটিগুলি দিয়েছি, প্রথমে জাভাতে গেটওয়ে সার্ভার চালু করার জন্য পাইজে 4 এর এই অসুবিধা রয়েছে, জে সি সি ইনস্টল করবে না। অবশেষে, জেপাইপ কাজ শেষ করে। গিথুবে জেপাইপের একটি রক্ষণাবেক্ষণযোগ্য কাঁটাচামচ রয়েছে । এর বড় সুবিধা রয়েছে যে (ক) এটি সঠিকভাবে ইনস্টল করে এবং (খ) এটি খুব দক্ষতার সাথে জাভা অ্যারেগুলিকে নাম্পার অ্যারেতে রূপান্তর করতে পারে ( np_arr = java_arr[:])

ইনস্টলেশন প্রক্রিয়াটি ছিল:

git clone https://github.com/originell/jpype.git
cd jpype
python setup.py install

এবং আপনি সক্ষম হতে হবে import jpype

নিম্নলিখিত ডেমো কাজ করেছে:

import jpype as jp
jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM() 

যখন আমি আমার নিজের জাভা কোডটি কল করার চেষ্টা করছিলাম, আমাকে প্রথমে সংকলন করতে হয়েছিল ( javac ./blah/HelloWorldJPype.java), এবং আমাকে ডিফল্ট থেকে জেভিএমের পথটি পরিবর্তন করতে হবে (অন্যথায় আপনি অনভিজ্ঞ "শ্রেণিটি খুঁজে পাচ্ছেন না" ত্রুটিগুলি পাবেন)) আমার জন্য, এর অর্থ স্টার্টজেভিএম কমান্ডটি এতে পরিবর্তন করা হয়েছে:

jp.startJVM('/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/MacOS/libjli.dylib', "-ea")
c = jp.JClass('blah.HelloWorldJPype')  
# Where my java class file is in ./blah/HelloWorldJPype.class
...

জাইপাইপকে ব্যবহার করা আরও সহজ করার জন্য একটি ছোট মোড়কের মডিউলটি এখানে: github.com/petered/spiking-mlp/blob/master/spiking_mlp/…
পিটার

4

আপনি যদি পাইথন 3 এ থাকেন তবে জেপাইপের একটি কাঁটা আছে যার নাম JPype1-py3

pip install JPype1-py3

এটি আমার জন্য ওএসএক্স / পাইথন ৩.৪.৩ এ কাজ করে। (আপনার প্রয়োজন হতে পারে export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version)

from jpype import *
startJVM(getDefaultJVMPath(), "-ea")
java.lang.System.out.println("hello world")
shutdownJVM()

4

আমি ইদানীং জাভা সহ পাইথনে প্রচুর পরিমাণে সংহত করছি। আমি সর্বাধিক শক্তিশালী পদ্ধতিটি পেয়েছি হ'ল আইকেভিএম এবং একটি সি # র‌্যাপার ব্যবহার করা।

আই কেভিএমের একটি ঝরঝরে সামান্য অ্যাপ্লিকেশন রয়েছে যা আপনাকে যে কোনও জাভা জেআর নিতে এবং এটি সরাসরি। নেট ডিএলএলে রূপান্তর করতে দেয়। এটি কেবল JVM বাইটকোডকে সিএলআর বাইটকোডে অনুবাদ করে। বিস্তারিত জানার জন্য http://sourceforge.net/p/ikvm/wiki/Ikvmc/ দেখুন ।

রূপান্তরিত লাইব্রেরি ঠিক একটি নেটিভ সি # লাইব্রেরির মতো আচরণ করে এবং আপনি জেভিএমের প্রয়োজন ছাড়াই এটি ব্যবহার করতে পারেন। তারপরে আপনি একটি সি # ডিএলএল মোড়ক প্রকল্প তৈরি করতে পারেন এবং রূপান্তরিত ডিএলএল-তে একটি উল্লেখ যুক্ত করতে পারেন।

আপনি এখন কিছু মোড়কের স্টাব তৈরি করতে পারেন যা আপনি যে পদ্ধতিগুলিকে প্রকাশ করতে চান সেগুলিকে কল করতে পারেন এবং সেই পদ্ধতিগুলি DllEport হিসাবে চিহ্নিত করুন। Https://stackoverflow.com/a/29854281/1977538 দেখুনবিশদ ।

মোড়ক ডিএলএল রফতানিকারক পদ্ধতিগুলি রফতানিকারক সি পদ্ধতির মতো দেখতে একটি নেটিভ সি লাইব্রেরির মতোই কাজ করে। আপনি যথারীতি সিটিপি ব্যবহার করে তাদের সাথে সংযোগ করতে পারেন।

আমি পাইথন ২.7 দিয়ে চেষ্টা করেছি, তবে এটি 3.0 এর সাথেও কাজ করা উচিত। উইন্ডোজ এবং লিনাক্সে কাজ করে

যদি আপনি সি # ব্যবহার করে থাকেন তবে প্রায় কোনও কিছুর অজগরকে সংহত করার সময় এটি সম্ভবত সেরা পন্থা।


1
আহ ... তুমি আমাকে সি # এ হারিয়েছিলে আমি কিছুটা কমে যাব না কারণ এটি বেশ কয়েকটি ক্ষেত্রে সম্ভাব্য সম্ভাবনা, তবে এটি অবশ্যই উইন্ডোজ এবং প্রচুর অন্যান্য স্টাফকে ধরে নিয়েছে।
জেয়ার্ড

2

আমি কেবল জেপাইপ ০.০.৪.২ (জুলাই ২০১১) ব্যবহার করতে শুরু করেছি এবং দেখে মনে হচ্ছে এটি দুর্দান্তভাবে কাজ করছে ...
আমি Xubuntu 10.04 এ আছি


1

আমি ধরে নিচ্ছি যে আপনি যদি সি ++ থেকে জাভাতে যেতে পারেন তবে আপনি প্রস্তুত। আপনি যে ধরণের কাজের উল্লেখ করেছেন তার একটি পণ্য আমি দেখেছি। এটি হ'ল আমরা যা ব্যবহার করেছি সেটি হ'ল কোডমেশ । আমি বিশেষত এই বিক্রেতাকে সমর্থন করছি না, বা তাদের পণ্যের তুলনামূলক গুণ সম্পর্কে কোনও বক্তব্য দিচ্ছি না, তবে আমি এটি বেশ উচ্চ পরিমাণের দৃশ্যে কাজ করতে দেখেছি।

আমি সাধারণত বলব যে যদি সম্ভব হয় তবে আমি জেএনআইয়ের মাধ্যমে সরাসরি সংহতকরণ থেকে দূরে রাখার সুপারিশ করব যদি আপনি পারেন তবে। কিছু সাধারণ আরআরইএসটি পরিষেবা পদ্ধতির, বা সারি-ভিত্তিক আর্কিটেকচারগুলি বিকাশ এবং নির্ণয়ের জন্য সহজ হতে থাকে। আপনি যদি সতর্কতার সাথে এই ডিকোপলড প্রযুক্তি ব্যবহার করেন তবে আপনি বেশ শালীন পারফরম্যান্স পেতে পারেন।


আরপিসি (বা REST) ​​আমার পক্ষে বিকল্প নয়।
ডেভিড পোর্টাবেলা

এর জন্য জাভা প্রক্রিয়াটি আগে শুরু করতে হবে এবং পাইথন ব্যবহারের আগে এটি চলছে কিনা তা নিশ্চিত করা দরকার। এটি ব্যর্থতার সম্ভাব্য পয়েন্ট। জেপাইপের পদ্ধতির দুর্দান্ত; এটি কেবল একটি মৃত প্রকল্প বলে মনে হচ্ছে।
ডেভিড পোর্টাবেলা

আমি সাধারণ পরামর্শ দিচ্ছি। জেএনআই একটি সম্ভাব্য মাইনফিল্ড।
djna

0

পাইথনের জাভা কোডের মধ্যে পাইথন কোডটি কীভাবে অজগর কোডের মধ্যে চলে সেটির মতোই কিছু জাভা কোড চালানোর চেষ্টা করার জন্য আমার নিজের অভিজ্ঞতার মাধ্যমে, আমি কোনও সরল অগ্রগতি পদ্ধতি আবিষ্কার করতে অক্ষম হয়েছি।

আমার সমস্যার সমাধান হ'ল এই জাভা কোডটি বেনশেল স্ক্রিপ্ট হিসাবে চালানো, বাইনশেল ইন্টারপ্রেটারকে শুল কমানড হিসাবে কল করে আমার পাইথন কোডের মধ্যে জাভা কোডটি অস্থায়ী ফাইলে উপযুক্ত প্যাকেজ এবং ভেরিয়েবলগুলির সাথে সম্পাদনা করার পরে।

আমি যা বলছি তা যদি কোনও উপায়ে সহায়ক হয় তবে আমি আমার সমাধানগুলির আরও বিশদ ভাগ করে নেওয়ার জন্য আপনাকে খুশী করছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.