Python in Java

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

Hier in der Firma gibt es eine App die per Java-Webinterface gesteuert wird und irgendwo auf einem Server läuft dann das richtige Java mit einer Datenbank und so. Die Server Applikation soll per Plugin erweitert werden.

Nun würde ich Python favorisieren, da man damit schneller analytische Lösungen programmieren kann. Nur wie kann ich es am besten anbinden? Ein paar Kollegen haben schonmal ein Interface zu C getestet, wo ein Funktionsaufruf definiert wurde (mit Hash-Maps als Input und Output und Übergabe es Datenbanknamens). Bloß C ist keine gute Lösung für schnelle Entwicklung.

Welche Möglichkeiten gibt es da für Python?

Jython kann vielleicht alles, aber es ist Python immer hinterher und man wäre auf eine Gruppe Jython Entwickler angewiesen?!

Ist JEPP noch aktuell? Kann es mit übergebenen Typen umgehen oder ist es eher wie ein Python Skriptaufruf? Gibt es da Einschränkungen und wäre es auf das definierte Interface mit dem Funktionsaufruf anwendbar (wo C schon läuft)?

Was sonst sind brauchbare Kommunikationsmethoden (RPC, ORB oder wie das so heißt :) )? Was könnten dort Nachteile sein (Geschwindigkeit?) ?

Das Interface könnte schon einfach sein, weil man evtl damit auskommt ein paar Datenbanknamen mitzuteilen. Aber es sollte schon "enterprise-safe" sein :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gerenuk hat geschrieben: Jython kann vielleicht alles, aber es ist Python immer hinterher und man wäre auf eine Gruppe Jython Entwickler angewiesen?!
Bist Du das bei Fremdbibliotheken nicht auch? Letztlich ist dieses "Problem" also imho kein wirkliches. Zumindest bekommst Du ein durchaus verbreitetes Tool, inkl. div. Tutorials und guter Dokumentation, was sich zudem bereits in der Praxis bewährt hat. Imho immer eine bessere Alternative, als sich sein eigenes Süppchen zu kochen.

Allerdings weiß ich nicht, inwiefern man ein eingebettetes Jython Sandboxed gestalten kann; ich würde da Zweifel haben. Solltest Du also da eine sichere Scriptingmöglichkeit erwarten, wäre wohl JavaScript, Lua oder ein Scheme wohl eher etwas für Dich.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

Hyperion hat geschrieben: Bist Du das bei Fremdbibliotheken nicht auch? Letztlich ist dieses "Problem" also imho kein wirkliches. Zumindest bekommst Du ein durchaus verbreitetes Tool, inkl. div. Tutorials und guter Dokumentation, was sich zudem bereits in der Praxis bewährt hat. Imho immer eine bessere Alternative, als sich sein eigenes Süppchen zu kochen.
Naja, will ja kein eigenes Süppchen kochen. Sondern eher eine gute Variante CPython zu benutzen. Also wenn es da halt was gibt.
Hyperion hat geschrieben:Solltest Du also da eine sichere Scriptingmöglichkeit erwarten, wäre wohl JavaScript, Lua oder ein Scheme wohl eher etwas für Dich.
Python wäre halt cooler, weil es da die besten Programmiermöglichkeiten gibt. Wäre denn Lua oder Scheme mit Java einfacher? Naja, egal. Besser Python :)
lunar

@Gerenuk: Beherrschen die Angestellten Deiner Firma Python denn überhaupt in ausreichendem Maße? Du darfst nicht vergessen, dass es durchaus einiges an Erfahrung benötigt, um gutes und idiomatisches Python zu schreiben, und damit dann auch messbare Zeitersparnisse bei der Entwicklung zu erreichen. Besteht Deine Firma ausschließlich aus Java-Entwickler, so wirst Du folglich mit Python kein Glück haben.

Im Bezug auf Python ist jython meines Wissens die einzige brauchbare Lösung. Ich habe keine persönliche Erfahrung mit jython, doch dem Hörensagen nach soll es auch wirklich brauchbar sein, und wird wohl auch produktiv genutzt. Ich glaube folglich nicht, dass Du Dir im Bezug auf jython ernsthafte Sorgen machen musst, vor allem nicht der Art, dass Du auf ein kleines Entwicklerteam angewiesen wärst. Das nämlich gilt wie gesagt bei diversen Drittbibliotheken ebenfalls, auch unter Java.

Es gibt natürlich auch diverse andere Sprachen, u.a. ein LISP-Dialekt namens Clojure, oder das berühmt-berüchtigte Scala. Doch auch hier gilt, dass bei den Angestellten der Firma, bzw. bei den mit dem Projekt betrauten Entwicklern genügend Erfahrung und/oder genügend Motivation zur Einarbeitung vorhanden sein muss, denn ein Umstieg von Java auf Python oder gar Clojure ist kein leichter Schritt. Programmiersprachen kann man nicht wechseln wie Hemden.
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

@lunar: Na wollen wir mal nicht die Frage in Frage stellen, sondern annehmen, die Voraussetzungen sind erfüllt und überlegen was die Lösung wäre :)
Ich zwar könnte lang die Firmensituation erklären, aber ist ja nicht Sinn der Sache alles anzuzweifeln ;)

Bei Jython stört mich halt, dass es auf alten Python Versionen basiert.

Deswegen dachte ich man könnte evtl eine einfache "Interface-Lösung" wählen und dann zu echtem CPython springen. Die Interface-Lösung wäre ja auch nicht auf Drittentwickler angewiesen, weil sie ja nur ein paar Grundlagen haben muss die da sind wenn sie einmal da sind. Im einfachsten Fall übergibt man nur den Datenbanknamen und gibt sich damit zufrieden.

Mich würde vorallem noch Einschätzungen zu den Lösungen wie XMLRPC oder dieses CORBA Dings interessieren.
lunar

@Gerenuk: Natürlich ist es allgemein möglich, die Funktionalität der Kernanwendung über einen wie auch immer gearteten Dienst zur Verfügung zu stellen, und anschließend mit Python auf diesen Dienst zuzugreifen, um Ressourcen der Anwendung anzufragen oder zu manipulieren.

Ob das in Deiner speziellen Situation allerdings sinnvoll und einer Einbettung eines Jython-Interpreters vorzuziehen ist, kann man Dir "allgemein" nicht beantworten, denn niemand kennt Deine Situation besser als Du. Wenn Du also schon nicht weißt, was sinnvoll ist, wie sollten wir das wissen können?

Zumal ich mir unter „man übergibt der Datenbanknamen und gibt sich damit zufrieden“ auch nicht allzu viel vorstellen kann, geschweige denn eine Idee darin erkennen kann.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Gerenuk, wenn es Java sein soll, ist denke ich Jython der beste Weg. Du kannst praktisch jede Java-Klasse und Methode direkt benutzen (auch die dieses CORBA-Dings ;). Ja, das Projekt hinkt hinter her und ja, du bist entweder auf die verbliebenden Freizeit-Entwickler von Jython angewiesen oder beteiligst dich selbst an der Entwicklung. Andererseits sind die Vorteile von Python 3.x gegenüber 2.x nicht so groß, dass die Massen wechseln, diese Version also leider in der Praxis bedeutungslos ist (für Anfänger dennoch das bessere Python) und zwischen 2.5 und 2.6 oder 2.7 ist jetzt auch nicht so viel passiert.

Besser unterstützt wird JRuby, da steht EngineYard hinter und Hauptentwickler Headius ist extrem aktiv (gestern twitterte er: "I'm having 8 unrelated conversations at the same time over IM and IRC, eating dinner, releasing "cloby" gem, and watching a movie."). Wenn du was Enterprise-kompatibles sucht, ist es wohl eher JRuby als Jython.

Groovy ginge auch, da steht SpringSource bzw. VMWare hinter. Ist aber - nur so ein Bauchgefühl, weil es schon einige Jahre her ist, dass ich mir das genau angeschaut habe - keine Empfehlung von mir. Dennoch, vielen gefällt's und dank Spring und diesem Roo-Krams definitiv Enterprise-kompatibel.

Von der Idee, über JNI eine in C implementierte Scriptsprache (CPython, aber auch Lua) an Java anzubinden, halte ich auch nicht so viel. Das ist aufgrund der doppelten Garbage Collection IMHO extrem fehleranfällig. Und Geschwindigkeitsrekorde gewinnt JNI auch nicht.

Für einfaches Scripting (gerade mit Sandbox) würde ich JavaScript, genauer Rhino, empfehlen - zumal das in einer leicht abgespeckten Version ja dem JDK 1.6 bereits beiliegt.

Lua gibt es AFAIK nicht in einer JVM-basierten Version. Und statt Scheme (wenn man kein Problem mit Klammern hat (ich mag ja Lisp (habe ich in der Uni gemacht))) würde ich Clojure empfehlen. Jedenfalls, um sich weiter zu bilden. Als Scriptsprache - ich weiß nicht.

Ich habe mich vor einiger Zeit daran versucht, Python-Interpreter in Java zu schreiben. Doch fertig ist da nix, das kann ich daher nur erwähnen um damit etwas anzugeben :) Ist aber natürlich auch ein Weg. Parser hat mich zwei Wochen gekostet, der Kern des Laufzeitsystems vielleicht noch mal eine Woche, der Rest wäre Fleißarbeit und einige Dinge (Generatoren etwa) gehen nur schlecht in Java. Ein reiner Interpreter ist allerdings recht langsam. Jython kompiliert den Quelltext in Java-Bytecode. Das ist besser, aber viel aufwendiger. JRuby macht das auch und zieht da alle Register, um tatsächlich schneller als Ruby 1.8 und in etwa genau so schnell zu sein wie Ruby 1.9, welches wiederum etwa so schnell ist wie CPython. Jython ist deutlich langsamer als CPython.

Stefan
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

Danke für die Einschätzung und die zahlreichen Vorschläge!

Es ist durchaus möglich, dass nachgedacht wird die Datenbanken als C++ (oder Java?) Klassen abbilden zu wollen.
Weiß noch jemand wie gut man mit Python mit einem C++ Klassenmodel interagieren kann? Wobei da sollen mäßig große Datenbanken abgebildet werden, also könnte Geschwindigkeit der Interaktion schon eine Rolle spielen?!

Und überhaupt, hat nicht Google irgendwo Python oder hat das eine andere Anwendung dort? Wie bekommen die es gebacken? :)
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Jetzt hamma Den Salat: *** das Jythonc-Paket wird nicht mehr supportet ***

Das Jytonc-Paket von Jython übersetzt Python2-Code in Java-Bytecode und war genau das, was ich für meine Arbeit gebraucht hätte! Nun will Jython damit nicht mehr weitermachen und sucht im Namen einer grauenhaften "seamless integration" Python und Java so zusammenzuwurschteln, dass man beide Sprachen beherrschen muss, um mit Jython zurechtzukommen. Hoffentlich habe ich da etwas falsch verstanden, aber ich befürchte das Schlimmste...
das Jythonbook hat geschrieben: Jythonc is no longer packaged with the Jython distribution beginning with the 2.5 release. [...] This method worked well and did what it was meant to do, [but] it caused a separation between the Jython code and the Java code.
Aber diese "separation between the Jython code and the Java code" ist ja gerade das Erstrebenswerte, was Jython so kool machte!


Zu meiner Motivation einige Infos:
lunar hat geschrieben:@Gerenuk: Beherrschen die Angestellten Deiner Firma Python denn überhaupt in ausreichendem Maße? Du darfst nicht vergessen, dass es durchaus einiges an Erfahrung benötigt, um gutes und idiomatisches Python zu schreiben, und damit dann auch messbare Zeitersparnisse bei der Entwicklung zu erreichen. Besteht Deine Firma ausschließlich aus Java-Entwickler, so wirst Du folglich mit Python kein Glück haben.

Im Bezug auf Python ist jython meines Wissens die einzige brauchbare Lösung. Ich habe keine persönliche Erfahrung mit jython, doch dem Hörensagen nach soll es auch wirklich brauchbar sein, und wird wohl auch produktiv genutzt. Ich glaube folglich nicht, dass Du Dir im Bezug auf jython ernsthafte Sorgen machen musst, vor allem nicht der Art, dass Du auf ein kleines Entwicklerteam angewiesen wärst. Das nämlich gilt wie gesagt bei diversen Drittbibliotheken ebenfalls, auch unter Java.
Die Einbettungssprache an meiner Firma MUSS Java sein und wird es auch bleiben; außerden kennen meine Arbeitskollegen kein Python und sollten es auch nicht benötigen. Ich darf meine Prototypen gerne in Python programmieren (wo ich vielfältige Alternativen ausprobieren kann), aber irgendwann müssen die dann auch umgesetzt, das heißt, an Java angepasst werden. Meine Java-Erfahrung ist bescheiden, und ich muss nun die effizienteste Art finden, Javaklassen bereitzustellen. Natürlich kann ich die Prototypen auch in Java neuprogrammieren, aber aber es ist leichter sie von Python3.x nach Python2.x zu übersetzen, eine Zeitlang schien es so, als ob Jython (genauer: das Jythonc-Paket) den Rest der Arbeit machen würde. Anscheinend bestehen die Befürchtungen von Gerenuk
Gerenuk hat geschrieben: Jython kann vielleicht alles, aber [...] man wäre auf eine Gruppe Jython Entwickler angewiesen
zu recht und wir sind nicht nur abhängig von den Jython-Entwicklern, sondern ihnen gänzlich ausgeliefert.


Sollte ich den Jython-Ansatz nun vergessen und schon mal mit Java-Programmieren anfangen? Wäre ich (rein theoretisch) mit JRuby besser gefahren?
BlackJack

@Goswin: Mit Deiner Erkenntnis, dass es kein ``jythonc`` mehr gibt, kommst Du mehr als ein Jahr "zu spät". Das ist ja nicht erst seit gestern so.

Man muss doch in jedem Fall Java können, oder zumindest wissen welche Anforderungen man überbrücken muss, weil Java halt gewisse statische Eigenschaften erwartet, die Python einfach nicht hat. Statt Java-Interfaces in Docstrings unterzubringen muss man jetzt halt wirklich Java-Interfaces schreiben und etwas Boilerplate-Code für Objekt-Factories in Java. Oder man verwendet Clamp -- das habe ich aber noch nicht ausprobiert.

Wenn man eine Sprache in eine andere einbettet, muss man IMHO sowieso immer beide können. Auch ``jythonc`` kann man nicht verwenden, wenn man kein Java kann. Genau so wenig wie man zum Beispiel `ctypes` verwenden kann, ohne C zu können.

Neben den Sprachunterschieden gibt es da ja auch noch die idiomatische Seite. Man kann in Python keine "Java-Klassen" schreiben, die sich nahtlos in Java-Programme einfügen und sich nicht wie Fremdkörper "anfühlen", wenn man die typischen Idiome von Java nicht kennt.

Ich glaube Du verbreitest hier einfach nur Panik über ein Thema was auch mit ``jythonc`` nicht so funkioniert hätte wie Du das wohl gerne hättest. Die Separation zwischen Python und Java möchte man ganz sicher *nicht* haben, wenn man Prototypen für Java-Programme in Python schreibt. Reine Python-Programme die "pythonisch" sind, lassen sich nämlich nur sehr schlecht in Java-Programme umsetzen. Dazu sind die Sprachen zu unterschiedlich. Man will da bei Prototypen schon eher Java-Programme in Python-Syntax schreiben, um den Entwicklungsprozess schneller und flexibler zu gestalten. Aber dabei kann man mit Jython halt auch schon auf Java-Rahmenwerke zurückgreifen, oder vorhandene Java-Klassen verwenden.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

BlackJack hat geschrieben:Wenn man eine Sprache in eine andere einbettet, muss man IMHO sowieso immer beide können. Auch ``jythonc`` kann man nicht verwenden, wenn man kein Java kann.
Pauschal gesehen, richtig: ich selber muss natürlich Java können. Aber meinen Arbeitskollegen darf ich nicht zumuten, ihre Interfaces pythongerecht anzupassen oder gar Boilerplate-Code für Objekt-Factories zu bauen, die können nur *dokumentierte class-Dateien zum importieren und aufrufen* gebrauchen. Mir ist leider noch immer nicht klar, ob solche class-Dateien unter der (relativ :wink:) neuen Jython-Verfahrensweise zu erstellen sind.
Blackjack hat geschrieben: Reine Python-Programme die "pythonisch" sind, lassen sich nämlich nur sehr schlecht in Java-Programme umsetzen. Dazu sind die Sprachen zu unterschiedlich. Man will da bei Prototypen schon eher Java-Programme in Python-Syntax schreiben.
Das bedeutet wohl im Klartext, ich sollte die Endfassung in Java programmieren, denn "java-pervertiertes" Python ist mir irgendwie zuwider. Man kann ja bekanntlich in fast jeder Sprache :wink: Javaprogramme schreiben. Bei mir haben die Jython-Leute ihr Produkt einfach zu sehr hochgelobt und dabei unrealistische Erwartungen geweckt.
BlackJack

@Goswin: Falls Du davon ausgegangen bist, dass Du einfach nur Python wie immer schreibst, und ``jythonc`` daraus dann *.class-Dateien erzeugt, die ein Java-Programmierer so benutzen kann wie er das von anderen Java-Klassen her gewohnt ist, dann waren das in der Tat unrealistische Erwartungen. Ich hatte aber auch nie das Gefühl. dass die Jython-Leute so etwas propagieren. Die "idiomatische Lücke" kann man nicht automatisiert schliessen.

Bei der *anderen* Richtung, also Java-Klassen in Jython-Code zu verwenden, wird eine Menge gemacht um die Verwendung angenehmer zu gestalten.

Die Objekt-Factories würden IMHO auch in Deinen Aufgabenbereich fallen und nicht in den Deiner Kollegen.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

@BlackJack: Vielen Dank für dein Stichwort "clamp", ein mir bisher unbekanntes Projekt, welches "jythonc" irgendwann einmal ersetzen soll. Folgende Info dazu halte ich für maßgeblich:
Frank Wierzbicki (head of the Jython project, in Jython Newsletter March 2009) hat geschrieben: When Jython [i.e. Jython2.5] executes any code, even in an interactive session, even in "eval" and "exec", it compiles the Python source directly into .class bytecodes. The old jythonc [from Jython2.2] first turned Python source into Java source, and then executed javac on the result.
Mir war neu, dass "jythonc" nicht direkt in Java-Bytecode übersetzte. Ich hatte die ganze Zeit eine Direktübersetzung vorausgesetzt, denn eine Vorübersetzung in Java-Quellcode ist natürlich schwierig und unerwünscht. Oder galt deine Bemerkung "Pythonische Python-Programme lassen sich nur sehr schlecht in Java-Programme umsetzen" auch für eine Direktübersetzung in Java-Bytecode?

Meine Entäuschung über das fehlende "jythonc" hält sich nun in Grenzen. Aber vielleicht muss ich nur ein wenig warten, denn:
Frank Wierzbicki hat geschrieben: Once Jython 2.5 comes out, clamp will become one of my highest priorities. We know that the jythonc replacements above are somewhat awkward.
(awkward indeed :wink:)
Antworten