Jaki jest najlepszy sposób wywoływania javy z Pythona? (jython i RPC nie są dla mnie opcją).
Słyszałem o JCC: http://pypi.python.org/pypi/JCC/1.9 generator kodu C ++ do wywoływania Javy z C ++ / Pythona Ale to wymaga kompilacji każdego możliwego wywołania; Wolałbym inne rozwiązanie.
Słyszałem o 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()
To wygląda na to, czego potrzebuję. Jednak ostatnie wydanie pochodzi ze stycznia 2009 roku i widzę, że ludzie nie potrafią skompilować JPype.
Czy JPype to martwy projekt?
Czy są jakieś inne alternatywy?
Pozdrawiam, David
Odpowiedzi:
Oto moje podsumowanie tego problemu: 5 sposobów wywoływania Javy z Pythona
http://baojie.org/blog/2014/06/16/call-java-from-python/ (w pamięci podręcznej )
Krótka odpowiedź: Jpype działa całkiem nieźle i jest sprawdzony w wielu projektach (takich jak python-boilerpipe), ale Pyjnius jest szybszy i prostszy niż JPype
Wypróbowałem Pyjnius / Jnius, JCC, javabridge, Jpype i Py4j.
Py4j jest trochę trudny w użyciu, ponieważ musisz uruchomić bramę, dodając kolejną warstwę kruchości.
źródło
Możesz także użyć Py4J . Na stronie głównej znajduje się przykład i mnóstwo dokumentacji, ale zasadniczo wywołujesz metody Java z kodu Pythona tak, jakby były metodami Pythona:
W przeciwieństwie do Jythona, jedna część Py4J działa na maszynie wirtualnej Python, więc zawsze jest "aktualna" z najnowszą wersją Pythona i możesz używać bibliotek, które nie działają dobrze w Jythonie (np. Lxml). Druga część działa na maszynie wirtualnej Java, którą chcesz wywołać.
Komunikacja odbywa się za pośrednictwem gniazd zamiast JNI, a Py4J ma własny protokół (w celu optymalizacji niektórych przypadków, zarządzania pamięcią itp.)
Zastrzeżenie: jestem autorem Py4J
źródło
s = gateway.jvm.ch.ethz.ssh2.crypto.Base64() bt_out = s.decode();
tutaj klasa Base64 ma metodę encode () i decode () i jest częścią pakietuch.ethz.ssh2.crypto
w moim pliku .jar. Dostajęfrom py4j.reflection import MethodInvoker ImportError: No module named reflection
Pyjnius.
Dokumenty: http://pyjnius.readthedocs.org/en/latest/
Github: https://github.com/kivy/pyjnius
Ze strony github:
źródło
Jestem na OSX 10.10.2 i udało mi się użyć JPype.
Wpadłem na problemy z instalacją z Jnius ( inni też ), Javabridge zainstalował się, ale dał tajemnicze błędy, kiedy próbowałem go użyć, PyJ4 ma tę niedogodność, że trzeba najpierw uruchomić serwer Gateway w Javie, JCC nie mógł zainstalować. Wreszcie JPype zaczął działać. Na Githubie jest utrzymywany fork JPype . Ma główne zalety, że (a) instaluje się poprawnie i (b) może bardzo wydajnie konwertować tablice java na tablice numpy (
np_arr = java_arr[:]
)Proces instalacji wyglądał następująco:
I powinieneś być w stanie
import jpype
Następujące demo zadziałało:
Kiedy próbowałem wywołać swój własny kod java, musiałem najpierw skompilować (
javac ./blah/HelloWorldJPype.java
) i zmienić ścieżkę JVM z domyślnej (w przeciwnym razie pojawią się niewytłumaczalne błędy „nie znaleziono klasy”). Dla mnie oznaczało to zmianę polecenia startJVM na:źródło
Jeśli jesteś w Pythonie 3, istnieje rozwidlenie JPype o nazwie JPype1-py3
To działa dla mnie na OSX / Python 3.4.3. (Może być konieczne
export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version
)źródło
Ostatnio integrowałem wiele rzeczy z Pythonem, w tym Javę. Najbardziej niezawodną metodą, jaką znalazłem, jest użycie IKVM i opakowania C #.
IKVM ma zgrabną małą aplikację, która pozwala na pobranie dowolnego Java JAR i konwersję go bezpośrednio do .Net DLL. Po prostu tłumaczy kod bajtowy maszyny JVM na kod bajtowy CLR. Szczegółowe informacje można znaleźć pod adresem http://sourceforge.net/p/ikvm/wiki/Ikvmc/ .
Przekonwertowana biblioteka zachowuje się tak jak natywna biblioteka C # i można jej używać bez konieczności korzystania z maszyny JVM. Następnie można utworzyć projekt opakowania DLL C # i dodać odwołanie do przekonwertowanej biblioteki DLL.
Możesz teraz utworzyć kilka kodów pośredniczących opakowania, które wywołują metody, które chcesz ujawnić, i oznaczyć te metody jako DllEport. Szczegółowe informacje można znaleźć pod adresem https://stackoverflow.com/a/29854281/1977538 .
Otaczająca biblioteka DLL działa jak natywna biblioteka C, a wyeksportowane metody wyglądają tak samo, jak wyeksportowane metody C. Możesz połączyć się z nimi za pomocą ctype jak zwykle.
Wypróbowałem to z Pythonem 2.7, ale powinno działać również z 3.0. Działa na Windows i Linux
Jeśli zdarzy ci się używać C #, jest to prawdopodobnie najlepsze podejście do wypróbowania podczas integracji prawie wszystkiego z Pythonem.
źródło
Dopiero zaczynam używać JPype 0.5.4.2 (lipiec 2011) i wygląda na to, że działa dobrze ...
Jestem na Xubuntu 10.04
źródło
Zakładam, że jeśli możesz przejść z C ++ do Java, to wszystko jest ustawione. Widziałem produkt, o którym wspomniałeś, że działa dobrze. Tak się składa, że użyliśmy CodeMesh . Nie popieram specjalnie tego dostawcy ani nie wypowiadam się na temat względnej jakości jego produktu, ale widziałem, jak działa on w scenariuszu o dość dużym wolumenie.
Powiedziałbym ogólnie, że jeśli to w ogóle możliwe, zalecałbym unikanie bezpośredniej integracji przez JNI, jeśli możesz. Niektóre proste podejście do usług REST lub architektura oparta na kolejkach będą zwykle prostsze do opracowania i diagnozowania. Możesz uzyskać całkiem przyzwoitą wydajność, jeśli ostrożnie używasz takich oddzielonych technologii.
źródło
Z własnego doświadczenia, próbując uruchomić kod java z poziomu pythona m.in. w sposób podobny do tego, jak kod python działa w kodzie java w pythonie, nie mogłem znaleźć prostej metodologii.
Rozwiązaniem mojego problemu było uruchomienie tego kodu java jako skryptów behellowych przez wywołanie interpretera behellu jako komendy powłoki z mojego kodu Pythona po edycji kodu java w pliku tymczasowym z odpowiednimi pakietami i zmiennymi.
Jeśli to, o czym mówię, jest w jakikolwiek sposób pomocne, z chęcią pomogę Ci podzielić się szczegółami moich rozwiązań.
źródło