Was ist der beste Weg, um Java von Python aus aufzurufen? (Jython und RPC sind für mich keine Option).
Ich habe von JCC gehört: http://pypi.python.org/pypi/JCC/1.9 ein C ++ - Codegenerator zum Aufrufen von Java aus C ++ / Python. Dies erfordert jedoch das Kompilieren jedes möglichen Aufrufs; Ich würde eine andere Lösung bevorzugen.
Ich habe von JPype gehört: 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 es brauche. Die letzte Version stammt jedoch aus dem Januar 2009 und ich sehe Leute, die JPype nicht kompilieren können.
Ist JPype ein totes Projekt?
Gibt es noch andere Alternativen?
Grüße, David
Antworten:
Hier ist meine Zusammenfassung dieses Problems: 5 Möglichkeiten, Java aus Python aufzurufen
http://baojie.org/blog/2014/06/16/call-java-from-python/ ( zwischengespeichert )
Kurze Antwort: Jpype funktioniert ziemlich gut und hat sich in vielen Projekten bewährt (z. B. Python-Boilerpipe), aber Pyjnius ist schneller und einfacher als JPype
Ich habe Pyjnius / Jnius, JCC, Javabridge, Jpype und Py4j ausprobiert.
Py4j ist etwas schwierig zu verwenden, da Sie ein Gateway starten müssen, um eine weitere Ebene der Fragilität hinzuzufügen.
quelle
Sie können auch Py4J verwenden . Es gibt ein Beispiel auf der Startseite und viele Dokumentationen, aber im Wesentlichen rufen Sie einfach Java-Methoden aus Ihrem Python-Code auf, als wären sie Python-Methoden:
Im Gegensatz zu Jython wird ein Teil von Py4J in der Python-VM ausgeführt, sodass es immer "auf dem neuesten Stand" mit der neuesten Version von Python ist und Sie Bibliotheken verwenden können, die unter Jython nicht gut laufen (z. B. lxml). Der andere Teil wird in der Java-VM ausgeführt, die Sie aufrufen möchten.
Die Kommunikation erfolgt über Sockets anstelle von JNI und Py4J verfügt über ein eigenes Protokoll (zur Optimierung bestimmter Fälle, zur Speicherverwaltung usw.).
Haftungsausschluss: Ich bin der Autor von Py4J
quelle
s = gateway.jvm.ch.ethz.ssh2.crypto.Base64() bt_out = s.decode();
Hier hat die Klasse Base64 die Methoden encode () und decode () und ist Teil des Paketsch.ethz.ssh2.crypto
in meiner JAR-Datei. Ich bekommefrom py4j.reflection import MethodInvoker ImportError: No module named reflection
Pyjnius.
Dokumente: http://pyjnius.readthedocs.org/en/latest/
Github: https://github.com/kivy/pyjnius
Von der Github-Seite:
quelle
Ich bin unter OSX 10.10.2 und habe JPype erfolgreich verwendet.
Bei Jnius sind Installationsprobleme aufgetreten ( andere auch ), Javabridge hat installiert, aber es gab mysteriöse Fehler, als ich versuchte, es zu verwenden. PyJ4 hat die Unannehmlichkeit, zuerst einen Gateway-Server in Java starten zu müssen, JCC würde nicht installieren. Schließlich funktionierte JPype. Es gibt eine gepflegte Gabel von JPype auf Github. Es hat die Hauptvorteile, dass (a) es ordnungsgemäß installiert wird und (b) es Java-Arrays sehr effizient in Numpy-Array konvertieren kann (
np_arr = java_arr[:]
)Der Installationsprozess war:
Und du solltest es können
import jpype
Die folgende Demo hat funktioniert:
Als ich versuchte, meinen eigenen Java-Code aufzurufen, musste ich zuerst compile (
javac ./blah/HelloWorldJPype.java
) und den JVM-Pfad vom Standardpfad ändern (andernfalls werden unerklärliche Fehler "Klasse nicht gefunden" angezeigt). Für mich bedeutete dies, den Befehl startJVM in Folgendes zu ändern:quelle
Wenn Sie in Python 3 sind, gibt es eine Gabelung von JPype namens JPype1-py3
Dies funktioniert bei mir unter OSX / Python 3.4.3. (Möglicherweise müssen Sie
export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version
)quelle
Ich habe in letzter Zeit eine Menge Dinge in Python integriert, einschließlich Java. Die robusteste Methode, die ich gefunden habe, ist die Verwendung von IKVM und eines C # -Wrappers.
IKVM hat eine nette kleine Anwendung, mit der Sie jede Java-JAR nehmen und direkt in die .NET-DLL konvertieren können. 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 wie eine native C # -Bibliothek, und Sie können sie verwenden, ohne die JVM zu benötigen. Anschließend können Sie ein C # DLL-Wrapper-Projekt erstellen und einen Verweis auf die konvertierte DLL hinzufügen.
Sie können jetzt einige Wrapper-Stubs erstellen, die die Methoden aufrufen, die Sie verfügbar machen möchten, und diese Methoden als DllEport markieren. Weitere Informationen finden Sie unter https://stackoverflow.com/a/29854281/1977538 .
Die Wrapper-DLL verhält sich wie eine native C-Bibliothek, wobei die exportierten Methoden genauso aussehen wie die exportierten C-Methoden. Sie können wie gewohnt mit ctype eine Verbindung zu ihnen herstellen.
Ich habe es mit Python 2.7 versucht, aber es sollte auch mit 3.0 funktionieren. Funktioniert unter Windows und Linux
Wenn Sie zufällig C # verwenden, ist dies wahrscheinlich der beste Ansatz, um fast alles in Python zu integrieren.
quelle
Ich fange gerade an, JPype 0.5.4.2 (Juli 2011) zu verwenden und es sieht so aus, als ob es gut funktioniert ...
Ich bin auf Xubuntu 10.04
quelle
Ich gehe davon aus, dass Sie fertig sind, wenn Sie von C ++ nach Java gelangen können. Ich habe gesehen, dass ein Produkt der von Ihnen erwähnten Art gut funktioniert. Zufällig haben wir CodeMesh verwendet . Ich unterstütze diesen Anbieter nicht ausdrücklich und mache keine Aussage über die relative Qualität seines Produkts, aber ich habe gesehen, dass es in einem Szenario mit ziemlich hohem Volumen funktioniert.
Ich würde allgemein sagen, dass ich, wenn möglich, empfehlen würde, sich von der direkten Integration über JNI fernzuhalten, wenn Sie können. Einige einfache REST-Service-Ansätze oder warteschlangenbasierte Architekturen sind in der Regel einfacher zu entwickeln und zu diagnostizieren. Wenn Sie solche entkoppelten Technologien sorgfältig einsetzen, können Sie eine recht anständige Leistung erzielen.
quelle
Aufgrund meiner eigenen Erfahrung mit dem Versuch, Java-Code in Python auszuführen, ähnlich wie Python-Code in Java-Code in Python ausgeführt wird, konnte ich keine einfache Methode finden.
Meine Lösung für mein Problem bestand darin, diesen Java-Code als Beanshell-Skripte auszuführen, indem ich den Beanshell-Interpreter als Shell-Commnad aus meinem Python-Code heraus aufrief, nachdem ich den Java-Code in einer temporären Datei mit den entsprechenden Paketen und Variablen bearbeitet hatte.
Wenn das, worüber ich spreche, in irgendeiner Weise hilfreich ist, helfe ich Ihnen gerne dabei, weitere Details meiner Lösungen mitzuteilen.
quelle