Migrazione da CPython a Jython

voti
24

Sto pensando di spostare il mio codice (circa 30K LOC) da CPython a Jython, in modo che io possa avere una migliore integrazione con il mio codice Java.

C'è una lista di controllo o una guida dovrei guardare, per aiutare la mia con la migrazione? Qualcuno ha esperienza con il fare qualcosa di simile?

Dalla lettura del sito Jython , la maggior parte dei problemi sembrano troppo oscuro a darmi fastidio.

Ho notato che:

  • sicurezza filo è un problema
  • supporto Unicode sembra essere molto diversa, che può essere un problema per me
  • MySQLdb non funziona e deve essere sostituito con zxJDBC

Qualunque altra cosa?

Questione connessa: Quali sono le strategie per scrivere codice Python che opera in CPython, Jython e IronPython

È pubblicato 07/01/2009 alle 14:46
fonte dall'utente
In altre lingue...                            


6 risposte

voti
8

Finora, ho notato due ulteriori problemi:

  • String internato 'a' è 'a' non è garantito (ed è solo un colpo di fortuna implementazione su CPython). Questo potrebbe essere un problema serio, e in realtà era in una delle biblioteche sono stato il porting (Jinja2). I test unitari sono (come sempre) i tuoi migliori amici!
Jython 2.5b0 (tronco: 5540, 31 Ottobre 2008, 13:55:41)
>>> 'a' è 'a'
Vero
>>> s = 'A'
>>> 'a' è s
falso
>>> 'A' s ==   
Vero
>>> intern ( 'a') è intern (s)
Vero

Ecco la stessa sessione su CPython:

Python 2.5.2 (R252: 60911, 5 ottobre 2008, 19:24:49)
>>> 'a' è 'a'
Vero
>>> s = 'A'
>>> 'a' è s
Vero
>>> 'A' s ==
Vero
>>> intern ( 'a') è intern (s)
Vero

  • os.spawn * funzioni non sono implementate. Invece utilizzare subprocess.call. Mi ha sorpreso molto, come l'implementazione utilizzando subprocess.call sarebbe stato facile, e sono sicuro che sono disposti ad accettare le patch.

(Ho fatto una cosa simile, come voi, il porting di un'applicazione da poco)

Risposto il 07/01/2009 a 16:01
fonte dall'utente

voti
3

Quando sono passato da un progetto CPython a Jython qualche tempo fa mi sono reso conto di una velocità-down fino a 50x per le sezioni time-critical. A causa di ciò sono rimasto con CPython.

Tuttavia, che potrebbe aver cambiato ora con le versioni attuali.

Risposto il 11/05/2009 a 10:03
fonte dall'utente

voti
10

Prima di tutto, devo dire la realizzazione Jython è molto buona. La maggior parte delle cose "solo di lavoro".

Qui ci sono alcune cose che ho incontrato:

  • moduli C non sono disponibili, ovviamente.

  • aperta ( 'file'). read () non chiude automaticamente il file. Questo ha a che fare con la differenza nel collettore spazzatura. Questo può causare problemi con troppi file aperti. E 'meglio usare il "con ( 'file') aperto fp" idioma.

  • Impostazione della directory di lavoro corrente (utilizzando os.setcwd ()) funziona per il codice Python, ma non per il codice Java. Emula la directory di lavoro corrente per tutto il file correlati, ma può farlo solo per Jython.

  • Analisi XML tenterà di convalidare un DTD esterno se è disponibile. Ciò può causare enormi rallentamenti in codice per la gestione di XML perché il parser scaricare la DTD attraverso la rete. Ho segnalato questo problema , ma finora rimane non fissato.

  • Il __ del __ metodo viene richiamato molto tardi nel codice Jython, non immediatamente dopo l'ultimo riferimento all'oggetto viene eliminato.

C'è un vecchio elenco di differenze , ma una lista recente non è disponibile.

Risposto il 05/04/2010 a 12:03
fonte dall'utente

voti
3

Si potrebbe anche desiderare di ricerca JPype . Io non sono sicuro di come matura viene confrontato con Jython, ma dovrebbe consentire CPython di accedere al codice Java.

Risposto il 05/04/2010 a 12:10
fonte dall'utente

voti
2

Recentemente, ho lavorato su un progetto per un professore nella mia scuola con un gruppo. Nella fase iniziale, è stato deciso che avremmo scritto il progetto in Python. Abbiamo sicuramente dovuto usare CPython. Abbiamo scritto il programma in Python e tutti i nostri test di unità alla fine lavorato. Poiché la maggior parte persone che già hanno Java installato sul proprio computer, e non Python, abbiamo deciso di distribuire solo come un vaso Jython. Abbiamo quindi scritto la GUI con swing, perché che è incluso nella libreria standard di Java.

La prima volta che ho eseguito il programma con Jython, si è schiantato subito. Per uno, ".fieldnames" di csv.reader sembravano sempre essere None. Quindi ho dovuto cambiare diverse parti del nostro codice per ovviare a questo.

Una sezione diversa del mio codice è caduto pure, che ha lavorato bene con CPython. Jython mi ha accusato di riferimento a una variabile prima che fosse assegnato nulla (che mi ha spinto noci e davvero non era il caso). Questo è un esempio: tipo esterno di ActiveState Codice Ricetta

Peggio ancora, la performance è stata terribile. Fondamentalmente questo codice combinato diversi file CSV, uno dei quali era di circa 2 GB. In CPython, correva in 8,5 minuti. In Jython, correva in 25 minuti.

Questi problemi è accaduto con 2.5.2rc2 (più tardi al momento della stesura di questo post).

Risposto il 16/12/2010 a 20:28
fonte dall'utente

voti
5

Sto iniziando questo come un wiki raccolti dalle altre risposte e la mia esperienza. Sentitevi liberi di modificare e aggiungere roba, ma per favore cerca di attenersi ai consigli pratici, piuttosto che un elenco di cose rotte. Ecco un vecchio elenco delle differenze dal sito Jython.

Gestione delle risorse

Jython non usa il conteggio di riferimento, e quindi le risorse vengono rilasciate come sono garbage collection, che è molto più tardi, allora si vedrebbe nel programma CPython equivalente

  • open('file').read()non chiude automaticamente il file. Meglio usare il with open('file') as fplinguaggio.
  • Il __ del __ metodo viene richiamato molto tardi nel codice Jython, non immediatamente dopo l'ultimo riferimento all'oggetto viene eliminato.

Integrazione MySQL

mysqldbè ac modulo, e pertanto non funzionerà in jython. Invece, si dovrebbe usare com.ziclix.python.sql.zxJDBC, fornito in dotazione al Jython.

Sostituire il seguente codice MySQLdb:

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

Con:

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

Avrete anche bisogno di sostituire tutto _mysql_exceptioncon zxJDBC.

Infine, è necessario sostituire i segnaposto query da %sa ?.

Unicode

  • Non si può esprimere caratteri unicode illegali in Jython. Cercando qualcosa di simile unichr(0xd800)potrebbe causare un'eccezione, e avendo un valore letterale u'\ud800' nel codice sarà solo devastare.

cose mancanti

  • moduli C non sono disponibili, ovviamente.
  • os.spawn * funzioni non sono implementate. Invece utilizzare subprocess.call.

Prestazione

  • Per la maggior parte dei carichi di lavoro, Jython sarà molto più lento di CPython. I rapporti sono nulla tra 3 a 50 volte più lento.

Comunità

Il progetto Jython è ancora vivo, ma non è in rapido movimento. Il dev mailing list ha circa 20 messaggi al mese, e sembra che ci siano solo circa 2 sviluppatori che impegnano il codice ultimamente.

Risposto il 19/12/2010 a 06:31
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more