Apa cara terbaik untuk memanggil java dari python? (jython dan RPC bukanlah pilihan bagi saya).
Saya pernah mendengar tentang JCC: http://pypi.python.org/pypi/JCC/1.9 generator kode C ++ untuk memanggil Java dari C ++ / Python Tapi ini membutuhkan kompilasi setiap panggilan yang mungkin; Saya lebih suka solusi lain.
Saya pernah mendengar tentang JPype: http://jpype.sourceforge.net/ tutorial: http://www.slideshare.net/onyame/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()
Ini terlihat seperti yang saya butuhkan. Namun, rilis terakhir adalah dari Jan 2009 dan saya melihat orang-orang gagal untuk mengkompilasi JPype.
Apakah JPype proyek mati?
Apakah ada alternatif lain?
Salam, David
Jawaban:
Berikut adalah ringkasan saya dari masalah ini: 5 Cara Memanggil Java dari Python
http://baojie.org/blog/2014/06/16/call-java-from-python/ (dalam cache )
Jawaban singkat: Jpype bekerja dengan cukup baik dan terbukti di banyak proyek (seperti python-boilerpipe), tetapi Pyjnius lebih cepat dan lebih sederhana daripada JPype
Saya telah mencoba Pyjnius / Jnius, JCC, javabridge, Jpype dan Py4j.
Py4j agak sulit digunakan, karena Anda perlu memulai gateway, menambahkan lapisan kerapuhan lainnya.
sumber
Anda juga bisa menggunakan Py4J . Ada contoh di halaman depan dan banyak dokumentasi, tetapi pada dasarnya, Anda cukup memanggil metode Java dari kode python Anda seolah-olah itu adalah metode python:
Berbeda dengan Jython, satu bagian dari Py4J berjalan di VM Python sehingga selalu "mutakhir" dengan versi terbaru Python dan Anda dapat menggunakan pustaka yang tidak berjalan dengan baik di Jython (misalnya, lxml). Bagian lainnya berjalan di VM Java yang ingin Anda panggil.
Komunikasi dilakukan melalui soket, bukan JNI dan Py4J memiliki protokolnya sendiri (untuk mengoptimalkan kasus tertentu, untuk mengelola memori, dll.)
Penafian: Saya adalah penulis Py4J
sumber
s = gateway.jvm.ch.ethz.ssh2.crypto.Base64() bt_out = s.decode();
Di sini kelas Base64 memiliki metode encode () dan decode () dan merupakan bagian dari paketch.ethz.ssh2.crypto
dalam file .jar saya. Saya mendapatkanfrom py4j.reflection import MethodInvoker ImportError: No module named reflection
Pyjnius.
Docs: http://pyjnius.readthedocs.org/en/latest/
Github: https://github.com/kivy/pyjnius
Dari halaman github:
sumber
Saya menggunakan OSX 10.10.2, dan berhasil menggunakan JPype.
Mengalami masalah instalasi dengan Jnius ( orang lain juga ), Javabridge diinstal tetapi memberikan kesalahan misterius ketika saya mencoba menggunakannya, PyJ4 mengalami ketidaknyamanan ini karena harus memulai server Gateway di Java terlebih dahulu, JCC tidak akan menginstal. Akhirnya, JPype akhirnya berhasil. Ada garpu JPype yang dipertahankan di Github. Ini memiliki keuntungan utama yaitu (a) diinstal dengan benar dan (b) dapat dengan sangat efisien mengonversi array java menjadi numpy array (
np_arr = java_arr[:]
)Proses instalasi adalah:
Dan Anda harus bisa
import jpype
Demo berikut berhasil:
Ketika saya mencoba memanggil kode java saya sendiri, saya harus terlebih dahulu mengkompilasi (
javac ./blah/HelloWorldJPype.java
), dan saya harus mengubah jalur JVM dari default (jika tidak, Anda akan mendapatkan kesalahan "kelas tidak ditemukan" yang tidak dapat dijelaskan). Bagi saya, ini berarti mengubah perintah startJVM menjadi:sumber
Jika Anda menggunakan Python 3, ada percabangan JPype yang disebut JPype1-py3
Ini berfungsi untuk saya di OSX / Python 3.4.3. (Anda mungkin perlu
export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version
)sumber
Saya telah mengintegrasikan banyak hal ke Python belakangan ini, termasuk Java. Metode paling kuat yang saya temukan adalah menggunakan IKVM dan pembungkus C #.
IKVM memiliki aplikasi kecil yang rapi yang memungkinkan Anda untuk mengambil Java JAR apa pun, dan mengubahnya langsung ke .Net DLL. Ini hanya menerjemahkan bytecode JVM ke bytecode CLR. Lihat http://sourceforge.net/p/ikvm/wiki/Ikvmc/ untuk detailnya.
Pustaka yang dikonversi berperilaku seperti pustaka C # asli, dan Anda dapat menggunakannya tanpa memerlukan JVM. Anda kemudian dapat membuat proyek pembungkus C # DLL, dan menambahkan referensi ke DLL yang dikonversi.
Sekarang Anda dapat membuat beberapa rintisan pembungkus yang memanggil metode yang ingin Anda tampilkan, dan menandai metode tersebut sebagai DllEport. Lihat https://stackoverflow.com/a/29854281/1977538 untuk detailnya.
DLL pembungkus bertindak seperti pustaka C asli, dengan metode yang diekspor tampak seperti metode C yang diekspor. Anda dapat terhubung dengan mereka menggunakan ctype seperti biasa.
Saya sudah mencobanya dengan Python 2.7, tetapi seharusnya berfungsi dengan 3.0 juga. Bekerja di Windows dan Linux
Jika Anda kebetulan menggunakan C #, maka ini mungkin pendekatan terbaik untuk dicoba ketika mengintegrasikan hampir semua hal ke dalam python.
sumber
Saya baru mulai menggunakan JPype 0.5.4.2 (Juli 2011) dan sepertinya berfungsi dengan baik ...
Saya menggunakan Xubuntu 10.04
sumber
Saya berasumsi bahwa jika Anda bisa berpindah dari C ++ ke Java maka Anda sudah siap. Saya telah melihat produk dari jenis yang Anda sebutkan bekerja dengan baik. Kebetulan yang kami gunakan adalah CodeMesh . Saya tidak secara khusus mendukung vendor ini, atau membuat pernyataan apa pun tentang kualitas relatif produk mereka, tetapi saya telah melihatnya berfungsi dalam skenario volume yang cukup tinggi.
Saya akan mengatakan secara umum bahwa jika memungkinkan, saya akan merekomendasikan untuk tidak melakukan integrasi langsung melalui JNI jika Anda bisa. Beberapa pendekatan layanan REST sederhana, atau arsitektur berbasis antrian akan cenderung lebih sederhana untuk dikembangkan dan didiagnosis. Anda bisa mendapatkan kinerja yang cukup baik jika Anda menggunakan teknologi yang dipisahkan dengan hati-hati.
sumber
Melalui pengalaman saya sendiri mencoba menjalankan beberapa kode java dari dalam python ia dengan cara yang mirip dengan bagaimana kode python berjalan dalam kode java di python, saya tidak dapat menemukan metodologi langsung.
Solusi saya untuk masalah saya adalah dengan menjalankan kode java ini sebagai skrip beanhell dengan memanggil juru bahasa beanshell sebagai shell commnad dari dalam kode python saya setelah mengedit kode java dalam file sementara dengan paket dan variabel yang sesuai.
Jika apa yang saya bicarakan bermanfaat dalam hal apa pun, saya senang membantu Anda membagikan lebih banyak detail tentang solusi saya.
sumber