Migración de CPython a Jython


Estoy considerando mover mi código (alrededor de 30K LOC) de CPython a Jython, para que pueda tener una mejor integración con mi código java.

¿Hay una lista de verificación o una guía que deba mirar, para ayudarme con la migración? ¿Alguien tiene experiencia en hacer algo similar?

Al leer el sitio Jython, la mayoría de los problemas parecen demasiado oscuros para molestarme.

Me di cuenta de que:

  • la seguridad del hilo es un problema
  • Soporte Unicode parece ser bastante diferente, lo que puede ser un problema para mí
  • mysqldb no funciona y necesita ser reemplazado por zxJDBC

¿Algo más?

Pregunta relacionada: ¿ Cuáles son algunas estrategias para escribir código python que funciona en CPython, Jython y IronPython

Author: Community, 2009-01-07

6 answers

En primer lugar, tengo que decir que la implementación de Jython es muy buena. La mayoría de las cosas "simplemente funcionan".

Aquí hay algunas cosas que me he encontrado:

  • Los módulos C no están disponibles, por supuesto.

  • Abrir ('archivo').read () no cierra automáticamente el archivo. Esto tiene que ver con la diferencia en el recolector de basura. Esto puede causar problemas con demasiados archivos abiertos. Es mejor usar el modismo" with open('file') as fp".

  • Configuración de la directorio de trabajo actual (usando os.setcwd()) funciona para código Python, pero no para código Java. Emula el directorio de trabajo actual para todo lo relacionado con el archivo, pero solo puede hacerlo para Jython.

  • El análisis XML intentará validar una DTD externa si está disponible. Esto puede causar ralentizaciones masivas en el código de manejo XML porque el analizador descargará el DTD a través de la red. I informó de este problema, pero hasta ahora sigue sin solucionarse.

  • El _ _ del __ el método se invoca muy tarde en el código Jython, no inmediatamente después de que se elimine la última referencia al objeto.

Hay una antigua lista de diferencias, pero no hay una lista reciente disponible.

 10
Author: Frederik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-05 13:03:03

Hasta ahora, he notado dos problemas más:

  • La internación de cadenas 'a' es 'a' no está garantizada (y es solo una fluke de implementación en CPython). Esto podría ser un problema serio, y realmente estaba en una de las bibliotecas que estaba portando (Jinja2). Las pruebas unitarias son (como siempre) tus mejores amigos!
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

Aquí está la misma sesión sobre 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.las funciones spawn* no están implementadas. En su lugar, utilice subproceso.llamada. Me sorprendió realmente, como el implementación mediante subproceso.llamar sería fácil, y estoy seguro de que aceptarán parches.

(He estado haciendo algo similar a usted, portando una aplicación recientemente)

 8
Author: Ali Afshar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-07 17:01:35

Estoy comenzando esto como un wiki recopilado de las otras respuestas y mi experiencia. Siéntase libre de editar y agregar cosas, pero por favor trate de seguir consejos prácticos en lugar de una lista de cosas rotas. Aquí hay una vieja lista de diferencias del sitio de Jython.

Gestión de recursos

Jython no utiliza el conteo de referencias, por lo que los recursos se liberan a medida que son basura recogida, que es mucho más tarde de lo que verías en el equivalente CPython programa

  • open('file').read() no cierra automáticamente el archivo. Mejor use el modismo with open('file') as fp.
  • El método __ del _ _ se invoca muy tarde en el código Jython, no inmediatamente después de que se elimine la última referencia al objeto.

Integración de MySQL

mysqldb es un módulo c, y por lo tanto no funcionará en jython. En lugar de eso, debe usar com.ziclix.python.sql.zxJDBC, que viene incluido con Jython.

Reemplace el siguiente MySQLdb código:

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")

También tendrás que reemplazar todo _mysql_exception por zxJDBC.

Finalmente, necesitará reemplazar los marcadores de posición de consulta de %s a ?.

Unicode

  • No se pueden expresar caracteres unicode ilegales en Jython. Intentando algo como unichr(0xd800) causaría una excepción, y teniendo un literal u'\ud800' en su código sólo causará estragos.

Cosas que faltan

  • C modules are not available, of curso.
  • os.las funciones spawn* no están implementadas. En su lugar, utilice subproceso.llamada.

Rendimiento

  • Para la mayoría de las cargas de trabajo, Jython será mucho más lento que CPython. Los informes son entre 3 y 50 veces más lento.

Comunidad

El proyecto Jython sigue vivo, pero no se mueve rápidamente. El dev mailing list tiene alrededor de 20 mensajes al mes, y parece que solo hay alrededor de 2 desarrolladores cometer código últimamente.

 5
Author: itsadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-19 07:31:54

Cuando cambié un proyecto de CPython a Jython hace algún tiempo, me di cuenta de una reducción de velocidad de hasta 50 veces para las secciones críticas de tiempo. Por eso me quedé con CPython.

Sin embargo, eso podría haber cambiado ahora con las versiones actuales.

 3
Author: wr.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-11 11:03:51

Es posible que también desee investigar JPype. No estoy seguro de cuán maduro es comparado con Jython, pero debería permitir a CPython acceder al código Java.

 3
Author: Cerin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-05 13:10:55

Recientemente, trabajé en un proyecto para un profesor en mi escuela con un grupo. Al principio, se decidió que escribiríamos el proyecto en Python. Definitivamente deberíamos haber usado CPython. Escribimos el programa en Python y todas nuestras pruebas unitarias finalmente funcionaron. Debido a que la mayoría de la gente ya tiene Java instalado en sus computadoras, y no Python, decidimos simplemente implementarlo como Jython jar. Por lo tanto, escribimos la GUI con Swing, porque eso está incluido en el estándar de Java biblioteca.

La primera vez que ejecuté el programa con Jython, se bloqueó inmediatamente. Por un lado, csv.lector ".fieldnames" siempre parecía ser Ninguno. Por lo tanto tuve que cambiar varias partes de nuestro código para trabajar alrededor de esto.

Una sección diferente de mi código también se estrelló, lo que funcionó bien con CPython. Jython me acusó de hacer referencia a una variable antes de que se le asignara nada (lo que me volvió loco y realmente no era el caso). Este es un ejemplo: Código de ActiveState Orden externo de la receta

Peor aún, la actuación fue horrible. Básicamente, este código combinaba varios archivos CSV, uno de los cuales era de aproximadamente 2 GB. En CPython, corrió en 8,5 minutos. En Jython, funcionó en 25 minutos.

Estos problemas ocurrieron con 2.5.2rc2 (el último en el momento de escribir este post).

 2
Author: Hut8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-16 21:28:04