Java Python Integration

Ich habe eine Java-App, die mit einer Drittanbieter-Bibliothek integrieren muss. Die Bibliothek ist in Python geschrieben, und ich habe noch nichts darüber zu sagen. Ich versuche, herauszufinden, den besten Weg, um mit ihm zu integrieren. Ich versuche JEPP (Java Embedded Python) – hat jemand das schon früher benutzt? Mein anderer Gedanke ist, JNI zu benutzen, um mit den C-Bindungen für Python zu kommunizieren.

Irgendwelche Gedanken auf dem besten Weg, dies zu tun wäre zu schätzen. Vielen Dank.

8 Solutions collect form web for “Java Python Integration”

Warum nicht Jython ? Der einzige Nachteil, den ich sofort denken kann, ist, wenn Ihre Bibliothek CPython native Erweiterungen verwendet.

EDIT: Wenn du Jython jetzt benutzen kannst, aber denk, dass du Probleme mit einer späteren Version der Bibliothek hast, schlage ich vor, dass du versuchst, die Bibliothek von deiner App zu isolieren (zB irgendeine Art von Adapterschnittstelle). Gehen Sie mit der einfachsten Sache, die für den Moment arbeitet, dann betrachten Sie JNI / CPython / etc, wenn und wann Sie jemals brauchen müssen. Es gibt wenig zu gewinnen, indem man die (schmerzhafte) JNI Route, wenn Sie wirklich haben müssen.

Frankly die meisten Möglichkeiten, um irgendwie laufen Python direkt aus JVM nicht funktionieren . Sie sind entweder nicht ganz kompatibel (neue Version Ihrer Drittanbieter-Bibliothek kann Python 2.6 Features verwenden und wird nicht mit Jython 2.5 arbeiten) oder hacky (es wird mit kryptischen JVM Stacktrace nicht wirklich zu Lösung führen).

Meine bevorzugte Möglichkeit, die beiden zu integrieren, würde RPC verwenden . XML RPC ist hier keine schlechte Wahl, wenn Sie mäßige Datenmengen haben. Es ist ziemlich gut unterstützt – Python hat es in seiner Standard-Bibliothek. Java-Bibliotheken sind auch leicht zu finden. Jetzt abhängig von deinem Setup entweder Java oder Python Teil wäre ein Server akzeptieren Verbindung aus anderen Sprache.

Ein weniger beliebt, aber es lohnt sich, alternativen Weg zu tun, um RPCs ist Google-Protobuffers, die 2/3 der Unterstützung für schöne rpc haben . Sie müssen nur Ihre Transportschicht bereitstellen. Nicht so viel Arbeit und die Bequemlichkeit des Schreibens ist vernünftig.

Eine weitere Möglichkeit ist, eine C-Wrapper um die Stücke von Python-Funktionalität zu schreiben, die Sie Java aussetzen müssen und diese über JVM native Plugins verwenden. Sie können die Schmerzen erleichtern, indem Sie mit SWIG SWIG gehen .

Im Wesentlichen in Ihrem Fall funktioniert es so:

  1. Erstellen Sie eine SWIG-Schnittstelle für alle Methodenaufrufe von Java auf C ++.
  2. Erstellen Sie C / C ++ – Code, der Ihre Anrufe empfängt und intern den Python-Interpreter mit den richtigen Paramenten anruft.
  3. Konvertieren Sie Antwort, die Sie von python erhalten und senden Sie es über swig zurück zu Ihrem Java-Code.

Diese Lösung ist ziemlich komplex, ein bisschen ein Overkill in den meisten Fällen. Immer noch lohnt es sich, wenn Sie (aus irgendeinem Grund) RPCs nicht leisten können. RPC wäre immer noch meine bevorzugte Wahl.

Mein anderer Gedanke ist, JNI zu benutzen, um mit den C-Bindungen für Python zu kommunizieren.

Ich mag sehr viel JNA :

JNA bietet Java-Programmen einfachen Zugriff auf native gemeinsame Bibliotheken (DLLs auf Windows), ohne etwas zu schreiben, aber Java-Code – kein JNI oder native Code erforderlich ist. Diese Funktionalität ist vergleichbar mit Windows 'Platform / Invoke und Python's Ctypes. Der Zugriff ist zur Laufzeit ohne Codegenerierung dynamisch.

Meine 0,02 $ 🙂

Hast du Lust auf Jython auf der Java VM?

Ich habe ein ähnliches Setup mit JNI untersucht. Vielleicht hilft das, wenn ich es noch nicht gesehen habe:

http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python

http://jpe.sourceforge.net/

Wenn du deinen Python-Code bekommen kannst, um in Jython zu arbeiten, dann solltest du das benutzen können, um es von Java zu nennen:

Sie könnten einen Messaging-Dienst wie ActiveMQ verwenden . Es hat sowohl Python- als auch Java-Unterstützung. Auf diese Weise können Sie die komplizierten JNI- oder C-Bindungen verlassen, wie sie sind und behandeln nur mit dem, was ich eine einfache Schnittstelle betrachte. Darüber hinaus, wenn die Bibliothek aktualisiert wird, müssen Sie nicht viel ändern, wenn überhaupt.

Viele Jahre später, nur um eine Option hinzuzufügen, die heute beliebter ist …

Wenn Sie CPython Funktionalität benötigen, ist py4j eine gute Option. Py4j hat gesehen, häufige Updates im Jahr 2016 und hat einige Popularität gewonnen, weil es zB von Apache Spark verwendet wird, um CPython Interoperabilität zu erreichen.

  • Zugriff auf Java-API-Informationen mit Python
  • Google App Engine - update_indexes Fehler
  • Java-Programme durch Python ausführen
  • Führen Sie .jar von Python aus
  • Automatisierte Python-Java-Übersetzung
  • Leistungsvergleich von Thrift, Protocol Puffer, JSON, EJB, anderen?
  • Wie man java von python mit PY4J anruft
  • Java-Äquivalent von Python's struct.pack?
  • Entschlüsseln von Daten in Python, die in Java von Java verschlüsselt wurden
  • Python-Äquivalent von Java StringBuffer?
  • Aufruf einer geerbten Klassenmethode aus Java
  • Python ist die beste Programmiersprache der Welt.