Seite 1 von 1
Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 19:40
von Dingels
Hallo liebe Leute,
für ein Programmierprojekt im Zuge meiner Masterarbeit möchte ich eine Webanwendung in Django schreiben. Diese Webanwendung soll eigentlich nur dazu dienen, größere Textkorpora über eine Upload-Form hochzuladen. Die Korpora sollen dann von einer Java-Anwendung weiterverarbeitet werden (Java deshalb, weil es einige wichtige Bibliotheken nur dafür gibt). Der Output der Java-Anwendung (hauptsächlich Listen von Strings) soll dann wieder an Django geschickt werden, um dort z.B. in Templates gerendert zu werden.
Nachdem ich mich ein wenig informiert habe, gibt es hierfür wohl zwei Möglichkeiten:
1) CPython + subprocess
2) Jython
Nach meinem Kenntnisstand ist es mit Variante 1) nicht möglich, Argumente an ein Java-Programm zu übergeben. Stimmt das?
Was Variante 2) angeht, soll Jython gerade bei rechenintensiven Vorgängen sehr langsam sein im Vergleich zu CPython. Lässt sich das umgehen, wenn ich die rechenintensiven Sachen nach Java auslagere? Außerdem ist die Datenbank-Konfiguration bei Jython wohl ziemlich kompliziert bzw. bei einigen Datenbanken ist die Unterstützung auch nicht sonderlich stabil.
Was soll ich tun? :K Hat irgendjemand Erfahrung mit Jython+Django? Irgendwelche Empfehlungen?
Dankeschön.

Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 19:50
von Hyperion
Dingels hat geschrieben:
Nach meinem Kenntnisstand ist es mit Variante 1) nicht möglich, Argumente an ein Java-Programm zu übergeben. Stimmt das?
Jein. Es kommt drauf an, wie Du das meinst. `subprocess`stellt keine Interprozesskommunikation dar; du kannst damit aber ein x beliebiges Programm starten und diesem Kommandozeilenargumente übergeben.
Dingels hat geschrieben:
Was Variante 2) angeht, soll Jython gerade bei rechenintensiven Vorgängen sehr langsam sein im Vergleich zu CPython.
Ich dachte Du willst nur das Frontend mit Jython betreiben? Da spielt Geschwindigkeit vermutlich eher keine Rolle - und für den Kern Deiner Anwendung greifst Du doch eh auf Java-Libs zurück.
Ich würde bei dem Ansatz erst einmal generell hinterfragen: Wieso muss es da Django sein und wieso muss es Python sein? Java bietet ja nun selber einiges in Sachen Webapps

Oder ist der Java-Teil eher gering und das Hauptaugenmerk liegt auf dem Frontend?
Alternativ könntest Du auch eine Multi-Tier Architektur in Betracht ziehen und den ganzen Java-Teil hinter XMLRPC kapseln und damit dann per Python-Webapp kommunizieren. Damit könntest Du für das Frontend auf bewährte und ggf. Dir gut bekannten Python-Tool-Stack zurückgreifen und den Java-Teil komplett unabhängig entwickeln und testen. Das wäre aber ja nur "nötig", wenn Du einen permanent laufenden Java-Prozess benötigst und eben nicht per `subprocess` arbeiten kannst.
Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 20:04
von Dingels
Hyperion hat geschrieben:
`subprocess`stellt keine Interprozesskommunikation dar; du kannst damit aber ein x beliebiges Programm starten und diesem Kommandozeilenargumente übergeben.
Achso, na wenn ich Kommandozeilenargumente übergeben kann, dann kann ich auch meine Texte an die Java-Anwendung übergeben. Dann ist das wohl doch nicht so kompliziert, wie ich dachte.
Hyperion hat geschrieben:
Ich dachte Du willst nur das Frontend mit Jython betreiben? Da spielt Geschwindigkeit vermutlich eher keine Rolle - und für den Kern Deiner Anwendung greifst Du doch eh auf Java-Libs zurück.
Stimmt, da hast Du auch wieder recht.
Hyperion hat geschrieben:
Ich würde bei dem Ansatz erst einmal generell hinterfragen: Wieso muss es da Django sein und wieso muss es Python sein? Java bietet ja nun selber einiges in Sachen Webapps

Oder ist der Java-Teil eher gering und das Hauptaugenmerk liegt auf dem Frontend?
Umgekehrt. Der Hauptteil soll in Java geschrieben werden. Django ist das einzige Web Framework, mit dem ich schon mal eine Anwendung erstellt habe. An Django schätze ich vor allem die sehr gute und auch für Anfänger verständliche Dokumentation. Ich hatte mir mal das Play! Framework für Java angeschaut, was stark an Django angelehnt ist, aber es ist nicht besonders gut dokumentiert. Deshalb würde ich lieber Django nehmen. Die anderen Java-Frameworks sind alle der pure Overkill für mein Anliegen. Zumal ich auch nicht die Zeit habe, mich in eine völlig neue riesige Architektur einzuarbeiten.
Hyperion hat geschrieben:
Alternativ könntest Du auch eine Multi-Tier Architektur in Betracht ziehen und den ganzen Java-Teil hinter XMLRPC kapseln und damit dann per Python-Webapp kommunizieren. Damit könntest Du für das Frontend auf bewährte und ggf. Dir gut bekannten Python-Tool-Stack zurückgreifen und den Java-Teil komplett unabhängig entwickeln und testen. Das wäre aber ja nur "nötig", wenn Du einen permanent laufenden Java-Prozess benötigst und eben nicht per `subprocess` arbeiten kannst.
Nein, permanent soll der Java-Prozess nicht laufen, sondern nur auf Anfrage.
Welche meiner genannten Varianten würdest Du unter diesen Gesichtspunkten vorziehen

Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 20:17
von Hyperion
Dingels hat geschrieben:
Welche meiner genannten Varianten würdest Du unter diesen Gesichtspunkten vorziehen

Ich würde dann in der Tat auf bekanntes zurückgreifen. Wenn Du Django kennst, dann bau das alles in Django und nutze dann das `subprocess`-Modul.
Die Java-Anwendung kannst Du dann einfach als Konsolen-App entwickeln und separat testen usw.
Ich hätte da noch eine Einschränkung bzw. etwas zu bedenken: Bei sämtlichen Netzwerk-Geschichten muss man sich vermutlich mal mit dem Thema Time-Out befassen. Ich weiß jetzt natürlich nicht, wie lange Deine Java-App pro Aufruf läuft und ob es da zu Problemen kommen kann. Das hängt dann vermutlich auch noch mit Server-Konfigurationen zusammen. Aber da kenne ich mich auch nicht näher aus.
Hinzu kommen Dinge wie Feedback geben bei längeren Prozessen. Da kommt man dann zu Themen wie Threading, die sich oftmals mit Eventschleifen usw. in die Quere kommen.
Auf jeden Fall ist die Chance hoch, dass es im Umfeld von Django Beispiele für solche Themen gibt

Und vielleicht brauchst Du das ja auch alles nicht zu beachten, weil das on-the-fly abläuft.
Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 20:42
von Dingels
Hyperion hat geschrieben:
Wenn Du Django kennst, dann bau das alles in Django und nutze dann das `subprocess`-Modul.
OK, erscheint mir auch am sinnvollsten. Jython scheint wohl auch noch nie häufig mit Django zusammen verwendet worden zu sein. Insbesondere die mangelnde Kompatibilität mit verschiedenen Datenbanken gibt mir da sehr zu denken. Außerdem wird das ganze so dann auch etwas modularer. Was die Performance nach dem Deployment betrifft, das wird man dann sehen. Ich hab ja noch nicht mal angefangen.

Aber für solche Probleme wird sich dann auch ne Lösung finden (vielleicht auch hier im Forum dank netten und kompetenten Leuten wie dir, Hyperion).
Also, vielen Dank für die Hilfe!

Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 20:43
von Hyperion
In Django bin ich nicht fit - aber es gibt hier schon viele, die das einsetzen und Erfahrungen damit haben.
Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 21:00
von BlackJack
@Dingels: Was sollen das denn für Probleme mit Datenbanken sein? Jython kommt mit einem Modul, das die Python DB API V2 auf JDBC abbildet. Wenn es also für ein DB-System einen JDBC-Treiber gibt, dann kann man das auch von Jython aus mit der üblichen API ansprechen.
Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 21:17
von Dingels
BlackJack hat geschrieben:@Dingels: Was sollen das denn für Probleme mit Datenbanken sein? Jython kommt mit einem Modul, das die Python DB API V2 auf JDBC abbildet. Wenn es also für ein DB-System einen JDBC-Treiber gibt, dann kann man das auch von Jython aus mit der üblichen API ansprechen.
Ja, das stimmt schon. Aber die Entwickler des Moduls sagen selbst, dass das teilweise nicht ganz so stabil ist. Für's Deployment werd ich wahrscheinlich MySQL nehmen und dazu
schreiben die Entwickler selbst:
The MySQL database backend has been exposed to limited practical testing, but appears mostly stable. It has been tested with MySQL version 5.1.34-community on Windows XP SP3.
Und dann ausgerechnet auf Windows getestet...

Also, ich weiß nicht, was ich davon halten soll. Wenn ich jetzt Jython nehme, dann werde ich ohnehin Java-Klassen in Python aufrufen und stark verzahnen. Wenn aber das Deployment mit MySQL nicht laufen sollte, dann muss ich das ganz auf CPython umbauen. Und darauf hab ich keine Lust.
Oder ist das Risiko eher gering? BlackJack, hast Du Erfahrung mit Jython + Django?
Re: Python + Django + Java = Jython?
Verfasst: Sonntag 15. Januar 2012, 21:55
von BlackJack
@Dingels: Mit der Kombination Jython + Django habe ich keine Erfahrung. Ich kenne aus der Praxis nur den Zugriff auf eine Informix-Datenbank per Jython. Das unter Windows getestet wurde, sehe ich nicht so kritisch, denn Zugriff über einen JDBC-Treiber auf MySQL sollte doch eigentlich davon unabhängig sein, auf welchen Systemen die Client-Anwendung und der DB-Server laufen.
Re: Python + Django + Java = Jython?
Verfasst: Montag 16. Januar 2012, 11:29
von apollo13
Dingels hat geschrieben:Nein, permanent soll der Java-Prozess nicht laufen, sondern nur auf Anfrage.
Also mal eben nen Java-Prozess starten würde ich nicht tun, je nach Programm (in meinem fall wars apache fop) ist das starten der Java-VM dann langsamer als die eigentliche Ausführungszeit im Programm. Ein simpler Java-XML-RPC Server wäre für sowas eigentlich schön. Grad Text über die Kommandozeile übergeben kann unlustig werden (encoding etc…)
Re: Python + Django + Java = Jython?
Verfasst: Montag 16. Januar 2012, 20:49
von Dingels
Ich glaube, ich habe eine Lösung für mein Problem gefunden. Jemand hat
ne geniale Bib geschrieben, mit der es möglich ist, Daten über nen Netzwerk-Socket zwischen CPython und Java auszutauschen. Dabei werden sogar Java-Collections in Python-Collections umgewandelt und umgekehrt. Hab das gerade getestet und es läuft wunderbar und performant. Sogar Austausch zwischen CPython und Scala (bzw. vermutlich jeder JVM-Sprache) ist möglich.

Und Strings werden automatisch in Unicode übergeben. Was will man mehr?
apollo13 hat geschrieben:Also mal eben nen Java-Prozess starten würde ich nicht tun, je nach Programm (in meinem fall wars apache fop) ist das starten der Java-VM dann langsamer als die eigentliche Ausführungszeit im Programm.
Nachdem ich jetzt eine Lösung gefunden habe, ist es wohl tatsächlich sinnvoller, den Java-Prozess direkt am Anfang zu starten. Oder?