Aufruf von Java aus Python [geschlossen]

Was ist der beste Weg, um Java aus Python zu nennen? (Jython und RPC sind keine Option für mich).

Ich habe von JCC gehört: http://pypi.python.org/pypi/JCC/1.9 ein C ++ – Code-Generator für den Aufruf von Java von C ++ / Python Aber das erfordert die Erstellung aller möglichen Anruf; Ich würde eine andere Lösung bevorzugen.

Ich habe über 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() 

Das sieht so aus, wie ich brauche Allerdings ist die letzte Veröffentlichung von Jan 2009 und ich sehe Leute, die es versäumt haben, JPype zu kompilieren.

Ist JPype ein totes Projekt?

Gibt es noch andere Alternativen?

Grüße, David

9 Solutions collect form web for “Aufruf von Java aus Python [geschlossen]”

Hier ist meine Zusammenfassung dieses Problems: 5 Wege des Aufrufs von Java von Python

http://baojie.org/blog/2014/06/16/call-java-from-python/

Kurze Antwort: Jpype funktioniert ziemlich gut und ist in vielen Projekten (wie Python-Boilerpipe) bewiesen, aber Pyjnius ist schneller und einfacher als JPype

Ich habe Pyjnius / Jnius, JCC, Javabridge, Jpype und Py4j ausprobiert.

Py4j ist ein bisschen schwer zu bedienen, wie Sie ein Gateway starten müssen, fügen Sie eine weitere Schicht von Zerbrechlichkeit.

Du könntest auch Py4J benutzen. Es gibt ein Beispiel auf der Vorderseite und viele Unterlagen, aber im Grunde nennen Sie einfach Java-Methoden aus Ihrem Python-Code, als ob sie Python-Methoden waren:

 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 

Im Gegensatz zu Jython läuft ein Teil von Py4J in der Python VM so ist es immer "up to date" mit der neuesten Version von Python und Sie können Bibliotheken, die nicht gut laufen auf Jython (zB lxml). Der andere Teil läuft in der Java VM, die du anrufen möchtest.

Die Kommunikation erfolgt über Steckdosen anstelle von JNI und Py4J hat ein eigenes Protokoll (um bestimmte Fälle zu optimieren, Speicher zu verwalten usw.)

Haftungsausschluss: Ich bin der Autor von Py4J

Pyjnius

Docs: http://pyjnius.readthedocs.org/de/latest/

Github: https://github.com/kivy/pyjnius

Von der github Seite:

Ein Python-Modul für den Zugriff auf Java-Klassen als Python-Klassen mit JNI.

PyJNIus ist ein "Work In Progress".

Schneller Überblick

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

Ich fange gerade an, JPype 0.5.4.2 (Juli 2011) zu verwenden und es sieht so aus, als ob es schön funktioniert …
Ich bin auf Xubuntu 10.04

Ich habe in letzter Zeit viele Sachen in Python integriert, darunter Java. Die robusteste Methode, die ich gefunden habe, ist die Verwendung von IKVM und einem C # Wrapper.

IKVM hat eine nette kleine Anwendung, die Ihnen erlaubt, jeden Java JAR zu nehmen und ihn direkt in .Net DLL zu konvertieren. Es übersetzt einfach den JVM-Bytecode in den CLR-Bytecode. Weitere Informationen finden Sie unter http://sourceforge.net/p/ikvm/wiki/Ikvmc/ .

Die konvertierte Bibliothek verhält sich genau wie eine native C # -Bibliothek, und ihr könnt es ohne die JVM verwenden. Sie können dann ein C # DLL-Wrapper-Projekt erstellen und einen Verweis auf die konvertierte DLL hinzufügen.

Sie können nun einige Wrapper-Stubs erstellen, die die Methoden aufrufen, die Sie aussetzen möchten, und markieren Sie diese Methoden als DllEport. Weitere Informationen finden Sie unter https://stackoverflow.com/a/29854281/1977538 .

Die Wrapper-DLL wirkt wie eine native C-Bibliothek, wobei die exportierten Methoden genau wie exportierte C-Methoden aussehen. Sie können sie mit ctype wie üblich verbinden.

Ich habe es mit Python 2.7 ausprobiert, aber es sollte auch mit 3.0 funktionieren. Arbeitet unter Windows und den Linuxen

Wenn Sie zufällig C # verwenden, dann ist dies wahrscheinlich der beste Ansatz zu versuchen, wenn die Integration fast alles in Python.

Ich bin auf OSX 10.10.2 und gelang es, mit JPype zu arbeiten.

Ran in Installationsprobleme mit Jnius ( andere haben auch ), Javabridge installiert aber gab mysteriöse Fehler, wenn ich versuchte, es zu benutzen, hat PyJ4 diese Unannehmlichkeit, einen Gateway-Server in Java zuerst starten, würde JCC nicht installieren. Schließlich landete JPype. Es gibt eine gepflegte Gabel von JPype auf Github. Es hat die großen Vorteile, dass (a) es ordnungsgemäß installiert und (b) es kann sehr effizient umwandeln Java-Arrays zu numpy Array ( np_arr = java_arr[:] )

Der Installationsvorgang war:

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

Und du solltest import jpype

Die folgende Demo arbeitete:

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

Als ich versuchte, meinen eigenen Java-Code javac ./blah/HelloWorldJPype.java , musste ich zuerst kompilieren ( javac ./blah/HelloWorldJPype.java ), und ich musste den JVM-Pfad von der Voreinstellung ändern (sonst bekommst du unerklärliche "Klasse nicht gefunden" Fehler) . Für mich bedeutet dies, den startJVM-Befehl zu ändern:

 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 ... 

Ich gehe davon aus, dass, wenn Sie von C ++ zu Java bekommen können, dann sind Sie alle eingestellt. Ich habe ein Produkt von der Art, die Sie erwähnen Arbeit gut gesehen. Wie es passiert, war das, was wir benutzten, CodeMesh . Ich bin nicht ausdrücklich befürwortet diese Verkäufer, oder eine Aussage über die relative Qualität ihres Produkts, aber ich habe gesehen, dass es in einem ziemlich großen Volumen-Szenario arbeiten.

Ich würde in der Regel sagen, dass, wenn überhaupt möglich, würde ich empfehlen, weg von der direkten Integration über JNI, wenn Sie können. Einige einfache REST-Service-Ansatz oder Warteschlange-basierte Architektur wird dazu neigen, einfacher zu entwickeln und zu diagnostizieren. Sie können ganz ordentliche Leistung bekommen, wenn Sie solche entkoppelten Technologien sorgfältig verwenden.

Durch meine eigene Erfahrung versucht, einige Java-Code aus Python ia Art und Weise ähnlich wie Python-Code läuft in Java-Code in Python laufen, war ich nicht in der Lage, eine geradlinige Methode finden.

Meine Lösung für mein Problem war, indem ich diesen Java-Code als Beanshell-Skripte durch den Aufruf der Beanshell-Interpreter als Shell-Commnad aus meinem Python-Code nach der Bearbeitung der Java-Code in einer temporären Datei mit den entsprechenden Pakete und Variablen.

Wenn das, was ich spreche, in irgendeiner Weise hilfreich ist, bin ich froh, Ihnen zu helfen, mehr Details meiner Lösungen zu teilen.

Wenn du in Python 3 bist, gibt es eine Gabel von JPype namens JPype1-py3

 pip install JPype1-py3 

Das funktioniert für mich auf OSX / Python 3.4.3. (Möglicherweise müssen Sie export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version )

 from jpype import * startJVM(getDefaultJVMPath(), "-ea") java.lang.System.out.println("hello world") shutdownJVM() 
  • JAXB-Äquivalent zur Erzeugung von c ++ - Klassen von xsd?
  • Gibt es ein Java-Äquivalent von Pythons Standarddict?
  • Integration von Java und Python Code in einem Eclipse Projekt
  • Python sehr langsam im Vergleich zu Java für diesen Algorithmus
  • Namespaces in C # vs Importe in Java und Python
  • Wie man einen Median-Haufen implementiert
  • Kann in Java implementiert werden?
  • Wie man eine Python-Regexp zu Java umwandelt
  • Bibliothek, um Directed Graphs (ähnlich wie graphviz) auf Google App Engine zu machen
  • Datenstruktur, um schnelle GPS-Lookups durchzuführen?
  • Unterschied zwischen Modulus Implementation in Python Vs Java
  • Python ist die beste Programmiersprache der Welt.