Frage

Ich betrachte meinen Code zu bewegen (um 30K LOC) von CPython zu Jython, so dass ich eine bessere Integration mit meinem Java-Code haben könnte.

Gibt es eine Checkliste oder eine Anleitung, die ich betrachten soll, um meine Hilfe bei der Migration? Hat jemand Erfahrung mit ähnlichen, etwas zu tun?

Aus der Lektüre der Jython Website , die meisten Probleme scheinen zu dunkel zu stören ich.

Ich habe bemerkt, dass:

  • Thread-Sicherheit ist ein Thema
  • Unicode-Unterstützung scheint ganz anders zu sein, was für mich ein Problem sein kann
  • mysqldb funktioniert nicht und muss mit zxJDBC ersetzt werden

Sonst noch etwas?

Verwandte Frage: Was sind einige Strategien, python-Code zu schreiben, der in CPython, Jython und Ironpython

War es hilfreich?

Lösung 3

Ich fange dies als Wiki von den anderen Antworten und meiner Erfahrung gesammelt. Fühlen Sie sich frei zu bearbeiten und Sachen hinzufügen, aber bitte versuchen Sie es zu praktischem Rat zu halten, anstatt eine Liste von zerbrochenen Dingen. Hier ist ein von Jython-Website.

Resource Management

Jython nicht Verweiszählung verwendet werden, und so Ressourcen, wie sie freigegeben Müll gesammelt werden, was viel später ist dann würden Sie im Ersatz sehen CPython Programm

  • open('file').read() schließt nicht automatisch die Datei. Besser nutzen die with open('file') as fp Idiom.
  • Die __ __ del Methode sehr spät in Jython Code aufgerufen wird, nicht sofort nachdem die letzte Referenz auf das Objekt gelöscht wird.

MySQL Integration

mysqldb ist ein C-Modul, und daher wird in jython nicht funktionieren. Stattdessen Sie verwenden com.ziclix.python.sql.zxJDBC sollte, die mit Jython mitgeliefert wird.

Ersetzen Sie den folgenden MySQLdb Code:

connection = MySQLdb.connect(host, user, passwd, db, use_unicode=True, chatset='utf8')

Mit:

url = "jdbc:mysql://%s/%s?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" % (host, db)
connections = zxJDBC.connect(url, user, passwd, "com.mysql.jdbc.Driver")

Sie finden auch alle _mysql_exception mit zxJDBC ersetzen müssen.

Schließlich müssen Sie die Abfrage Platzhalter von %s ersetzen ?.

Unicode

  • Sie können nicht illegal Unicode-Zeichen in Jython auszudrücken. Der Versuch, etwas wie unichr(0xd800) würde eine Ausnahme verursachen und eine wörtliche u'\ud800' mit in Ihrem Code auslassen nur Chaos.

Fehlende Dinge

  • C-Module sind nicht verfügbar, natürlich.
  • os.spawn * Funktionen sind nicht implementiert. Statt subprocess.call verwenden.

Performance

  • Für die meisten Workloads wird Jython viel langsamer als CPython. Die Berichte sind alles zwischen 3 bis 50 mal langsamer.

Community

Das Jython-Projekt ist noch am Leben, aber nicht schnelllebig. Das dev Mailingliste hat etwa 20 Nachrichten pro Monat, und es scheint nur etwa 2 Entwickler zu sein commiting Code in letzter Zeit.

Andere Tipps

Als erstes muss ich die Jython Implementierung sagen ist sehr gut. Die meisten Dinge „funktionieren“.

Hier sind ein paar Dinge, die ich erlebt habe:

  • C-Module sind nicht verfügbar, natürlich.

  • open ( 'Datei'). Read () schließt nicht automatisch die Datei. Dies hat mit dem Unterschied in der Garbage Collector zu tun. Dies kann zu viele offene Dateien zu Problemen führen. Es ist besser, die "mit open ( 'Datei') als fp" Idiom zu verwenden.

  • Einstellen des aktuellen Arbeitsverzeichnis (mit os.setcwd ()) arbeitet für Python-Code, aber nicht für Java-Code. Es emuliert das aktuelle Arbeitsverzeichnis für alle dateibezogenen, sondern kann nur tun, für Jython.

  • XML-Parsing wird versuchen, eine externe DTD zu validieren, wenn es verfügbar ist. Dies können massive Verlangsamungen in XML-Handling-Code führen, da der Parser die DTD über das Netzwerk verwendet wird. Ich berichten diese Ausgabe , aber so weit es bleibt nicht fixiert.

  • Die __ __ del Methode sehr spät in Jython Code aufgerufen wird, nicht unmittelbar nach dem letzten Verweise auf das Objekt gelöscht wird.

Es gibt eine , aber eine aktuelle Liste ist nicht verfügbar.

Bisher habe ich zwei weitere Probleme bemerkt:

  • String interning ‚a‘ ist ‚a‘ ist nicht garantiert (und es ist nur eine Implementierung Flunke auf CPython). Dies könnte ein ernstes Problem sein, und wirklich war in einer der Bibliotheken ich Portierung (Jinja2). Unit-Tests sind (wie immer) Ihre besten Freunde!
Jython 2.5b0 (trunk:5540, Oct 31 2008, 13:55:41)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
False
>>> 'a' == s   
True
>>> intern('a') is intern(s)
True

Hier ist die gleiche Sitzung auf CPython:

Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
True
>>> 'a' == s
True
>>> intern('a') is intern(s)
True

  • os.spawn * Funktionen sind nicht implementiert. Stattdessen subprocess.call verwenden. Ich war überrascht, wirklich, da die Umsetzung subprocess.call Verwendung wäre leicht, und ich bin sicher, dass sie Patches akzeptieren.

(Ich habe eine ähnliche Sache wie du gemacht, eine App vor kurzem Portierung)

Wenn ich ein Projekt von CPython zu Jython vor einiger Zeit eingeschaltet wurde mir klar, eine Geschwindigkeit nach unten von bis zu 50x für zeitkritische Abschnitte. Aufgrund der, dass ich blieb bei CPython.

Allerdings hat das könnte jetzt mit den aktuellen Versionen geändert.

Sie können auch die Forschung wollen JPype . Ich bin mir nicht sicher, wie reif sie Jython verglichen werden, aber es sollte CPython erlauben Java-Code zugreifen zu können.

Vor kurzem arbeitete ich an einem Projekt für einen Professor an meiner Schule mit einer Gruppe. Schon früh, wurde beschlossen, dass wir das Projekt in Python schreiben würden. Wir sollten auf jeden Fall CPython verwendet haben. Wir schrieben das Programm in Python und alle unsere Unit-Tests schließlich arbeitete. Weil die meisten Leute bereits Java auf ihren Computern installiert haben, und nicht Python, haben wir beschlossen, nur um es als Jython Glas einzusetzen. Wir schrieben deshalb die GUI mit Swing, weil das in Java-Standardbibliothek enthalten ist.

Das erste Mal, dass ich das Programm mit Jython lief, es stürzte sofort. Zum einem csv.reader des „.fieldnames“ immer schien keine zu sein. Deshalb hatte ich mehrere Teile unseres Code zu ändern, dies zu umgehen.

Ein anderer Abschnitt meines Code abgestürzt als auch, was mit CPython fein gearbeitet. Jython warf mir eine Variable zu referenzieren, bevor er etwas zugewiesen wurde (die Nüsse fuhr mich und wirklich nicht der Fall war). Dies ist ein Beispiel: Active-Code Rezept Außen Art

Schlimmer noch war die Leistung schrecklich. Grundsätzlich ist dieser Code mehr CSV-Dateien kombiniert, von denen etwa 2 GB war. In CPython, lief es in 8,5 Minuten. In Jython, lief es in 25 Minuten.

Diese Probleme mit 2.5.2rc2 passiert ist (spätestens zum Zeitpunkt diesen Beitrag zu schreiben).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top