Вы находитесь на странице: 1из 5

043-047_Python_Linux4

15.02.2005

11:06 Uhr

Pgina 43

Python

DESARROLLO

No has encontrado tu lector RSS? Hazte uno tu mismo con Jython.

Cuando los Mundos Chocan


Este mes, os descubrimos Jython. La forma mas sencilla de desarrollar vuestras aplicaciones Java como si las programramos con Python.
POR PEDRO ORANTES Y JOS MARA RUZ

uchos os preguntareis que es Jython. Bien, empecemos desde el principio. Un grupo de programadores, Jim Hugunim (su creador) y Guido van Rossum (personalidad dentro del mundo de Python) entre otros, decidieron que la simpleza y la limpieza del cdigo de Python hara perfecto programar en Java, as que se pusieron manos a la obra, y crearon Jython. Jython es la implementacin de Python en la plataforma Java, combinando la potencia de los paquetes de Java, como JavaBeans, con la facilidad y rapidez de desarrollo de aplicaciones de Python. Recordad que desarrollar una aplicacin es por lo menos dos veces ms corto en Python que en Java. Jython posee las mismas caractersticas de Python y adems posee la caracterstica de poder trabajar con las libreras de Java, de forma que, por ejemplo, podemos disponer del bonito swing de Java o utilizar JavaBeans e incluso programar applets. En la Web de Jython en [1] aparecen algunos ejemplos de applets desarrollados en Jython. Esto hace de l un lenguaje muy potente ya que nos ahorramos tiempo, lneas de cdigo y resulta menos engorroso de leer que Java. Incluso podemos compilar el cdigo para no tener la necesidad de instalar Jython antes de ejecutar nuestra aplicacin en cualquier ordenador ya que es capaz de generar Bytecode Java (aunque s necesitamos tener Java, obviamente). Aunque

ciertamente no todo es positivo. Las aplicaciones desarrolladas con Jython suelen ser bastante ms lentas que las desarrolladas con Java y de esto se quejan muchos programadores, pero an as, la potencia y rapidez de los ordenadores de hoy hace que apenas se note la diferencia. Muchos os preguntareis si hace falta saber Java para programar Jython. En principio, no. S es conveniente tener

idea de su funcionamiento y disponer de la API de Java, disponible en la web de Sun [2], para saber que queremos hacer y como lo queremos hacer, pero la sintaxis y la forma de programar es muy diferente. Programar en Java sin la API de Sun resulta, en la mayor parte de los casos, imposible. En cambio, para programar en Jython s es necesario saber programar en Python, as pues, damos

Listado 1: Tres botones


01 import javax.swing as swing 02 import java.awt as awt 03 04 cuadroTexto = swing.JTextField(10) 05 06 def __init__(): 07 win = swing.JFrame("Ejemplo con botones") 08 acciones = ['uno', 'dos', 'tres'] 09 10 pnlBotones = swing.JPanel(awt.FlowLayout()) 11 12 pnlBotones.add(cuadroTexto) 13 for cadaBoton in acciones: 14 pnlBotones.add(swing.JButton(cad aBoton,actionPerformed=accion)) 15 16 win.contentPane.add(pnlBotones ) 17 win.size=(300,300) 18 win.pack() 19 win.show() 20 21 def accion(event): 22 accionBoton = event.getActionCommand() 23 if accionBoton == "uno": 24 cuadroTexto.setText("UNO") 25 elif accionBoton == "dos": 26 cuadroTexto.setText("DOS") 27 else: 28 cuadroTexto.setText("TRES") 29 root = __init__()

www.linux-magazine.es

Nmero 04

43

043-047_Python_Linux4

15.02.2005

11:06 Uhr

Pgina 44

DESARROLLO

Python

Listado 2: JyRSS.py
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 #!/usr/bin/jython import import import import import javax.swing as swing java.lang as lang java.awt as awt java.util as util os 034 035 036 037 038 039 self.pnlBoton.add(lblNombre) 040 def __init__(self): self.vectorrss = util.Vector() self.vectorurl = util.Vector() self.listaRSS() self.listaNoticias() self.pnlBotones() self.menu() if os.path.exists('listarss.txt' ): self.leeFicheroRss() self.win = swing.JFrame("JyRss", size=(300, 300),windowClosing=self.exit) self.win.setJMenuBar(self.men u) 026 self.win.contentPane.add(self .pnlBoton,awt.BorderLayout.NO RTH) 027 self.win.contentPane.add(self .jscplista, awt.BorderLayout.WEST) 028 self.win.contentPane.add(self .jscpNoticias, awt.BorderLayout.CENTER) 029 self.win.setSize(600, 400) 030 self.win.show() 031 032 def pnlBotones(self): 033 self.pnlBoton = swing.JPanel(awt.FlowLayout() ) 041 self.pnlBoton.add(lblUrl) 042 self.pnlBoton.add(self.txtUrl ) 043 044 045 self.pnlBoton.add(swing.JButt on(cadaBoton, actionPerformed=self.accionMe nu)) 046 047 048 def menu(self): opciones = ["Guardar"] 049 self.menu = swing.JMenuBar() 050 archivo = swing.JMenu("Archivo") 051 for eachOpcion in opciones: 052 archivo.add(swing.JMenuItem(e achOpcion, actionPerformed=self.accionMe nu)) 053 self.menu.add(archivo) 054 055 def listaRSS(self): 056 self.lstLista = swing.JList() 057 self.jscplista = swing.JScrollPane(self.lstLis ta) 058 self.jscplista.setSize(100,10 0) for cadaBoton in acciones: self.pnlBoton.add(self.txtNom bre) acciones = ["Aadir","Borrar","Leer"] self.txtUrl = swing.JTextField(10) lblNombre = swing.JLabel("Nombre") self.txtNombre = swing.JTextField(10) lblUrl = swing.JLabel("Url") 059 060 061 def listaNoticias(self): self.lstNoticias = swing.JEditorPane() 062 self.jscpNoticias = swing.JScrollPane(self.lstNot icias) 063 064 def leeFicheroRss(self): 065 f = open('listarss.txt','r') 066 fu = open('listaurl.txt', 'r') 067 linea = f.readline() 068 lurl = fu.readline() 069 while linea: 070 self.vectorrss.add(linea) 071 self.vectorurl.add(lurl) 072 linea = f.readline() 073 lurl = fu.readline() 074 f.close() 075 fu.close() 076 self.lstLista.setListData(sel f.vectorrss) 077 078 def leeFicheroNoticias(self): 079 fg = open('news.txt','r') 080 texto = fg.read() 081 fg.close() 082 self.lstNoticias.setText(text o) 083 084 def guardarFichero(self): 085 fg = open('listarss.txt','w') 086 furl = open('listaurl.txt','w') 087 j = self.vectorrss.size() 088 i = 0 089 while i<=j-1: 090 texto = self.vectorrss.get(i) 091 fg.write(texto +'\n') 092 texto = self.vectorurl.get(i)

class Lector: def exit(self, event): lang.System.exit(0)

023 024

025

44

Nmero 04

www.linux-magazine.es

043-047_Python_Linux4

15.02.2005

11:06 Uhr

Pgina 45

Python

DESARROLLO

Figura 1: Nuestra utilidad busca-palabras en marcha.

plo de este artculo nos valdremos de una aplicacin externa ligeramente modificada (el cdigo original lo encontrareis en la web de xml.com en [3]) desarrollada en Python, para que podis echarle un ojo al cdigo si os apetece, desde la cual parsearemos el xml de un documento RSS para leer las ltimas noticias de los blogs que mas frecuentemente visitemos. Ms adelante explicaremos esto detalladamente.

por sabido todo lo que hayis aprendido en los artculos anteriores de esta revista. En este artculo aprenderemos a usar elementos bsicos de Java en Jython, trabajaremos con swing, y usaremos algunos objetos de Java como son los vectores, entre otras cosas. Para el ejem-

Instalacin de Jython.
Para trabajar con Jython, necesitamos tener Java instalado en nuestro ordenador. Podemos usar el Java Runtime Edition (j2re), o el Java Developers Kit(j2sdk), en su version 1.4.2 como mnimo, descargables desde [2].

Listado 2: JyRSS.py (continuacin)


093 +'\n') 094 095 096 097 098 i = i+1 fg.close() furl.close() furl.write(texto 112 self.txtUrl.setText("") 113 114 'Leer': 115 item = self.lstLista.getSelectedInde x() 116 url = self.vectorurl.get(item) 117 os.system('python lrss.py '+ url) 118 self.leeFicheroNoticias() 119 120 elif self.accion == 'Borrar': 121 itemborrar = self.lstLista.getSelectedInde x() 122 self.vectorrss.remove(itembor rar) 123 self.vectorurl.remove(itembor rar) 124 self.lstLista.setListData(sel f.vectorrss) 125 126 elif self.accion == 'Guardar': 127 self.guardarFichero() 128 root = Lector() elif self.accion == self.txtNombre.setText("")

Adems necesitamos instalar el intrprete de Jython disponible en [1], en su ltima versin estable (la jython-2.1) y, por ltimo, para ejecutar nuestra aplicacin, deberemos tener instalado el intrprete de Python (versin 2.3). Una vez hemos descargado el intrprete de Jython, debemos proceder a la instalacin del mismo. Ejecutamos java jython-21 y nos saldr el instalador (Figura 1), que nos pedir confirmar una serie de opciones y un directorio y ya tendremos Jython instalado en nuestro ordenador. Adicionalmente podemos enlazar los ejecutables de Jython a nuestro directorio de binarios del sistema (ln -s jython-2.1/jython /usr/bin/jython y ln -s jython-2.1/jythonc /usr/bin/jythonc en nuestro caso) para no tener que ejecutar los binarios desde el directorio donde lo tengamos instalado. Esto ltimo es recomendable, adems de que resulta mucho ms cmodo.

Primeros pasos
Bueno, ya est todo preparado en nuestro sistema. Es hora de ver como funciona Jython. Para empezar, podis trastear un poco con el intrprete como lo habis hecho con el de Python, y as podris ver que el funcionamiento es idntico.
$ jython Jython 2.1 on java1.4.2_05U (JIT: null) Type "copyright", "credits" orU "license" for more information. >>> print 'Hola Mundo' Hola Mundo >>>

def accionMenu(self, event): 099 self.accion = event.getActionCommand() 100 if self.accion == 'Aadir': 101 if self.txtNombre.getText() == "": 102 self.vectorrss.add("SIN NOMBRE\n") 103 else: 104 self.vectorrss.add(self.txtNo mbre.getText()) 105 if self.txtUrl.getText() == "": 106 self.vectorurl.add("SIN URL\n") 107 else: 108 self.vectorurl.add(self.txtUr l.getText()) 109 110 self.lstLista.setListData(sel f.vectorrss) 111

Bien, vamos a empezar a ver algunos ejemplitos en java. Para empezar, qu tal el tpico Hola mundo con swing? Este ejemplo mostrar una ventana llamada Hola Mundo, con un cuadro de texto. Para cerrarla tendris que cerrar el intrprete con Control + C ya que en el ejemplo, no implementamos la salida de la aplicacin.
01 $ jython 02 Jython 2.1 on java1.4.2_05 (JIT: null) 03 Type "copyright", "credits" or "license" for more information.

www.linux-magazine.es

Nmero 04

45

043-047_Python_Linux4

15.02.2005

11:06 Uhr

Pgina 46

DESARROLLO

Python

04 >>> import javax.swing as swing 05 >>> win = swing.JFrame("Hola mundo") 06 >>> texto = swing.JLabel("Hola mundo") 07 >>> win.contentPane.add(texto) 08 >>> win.pack() 09 >>> win.show() 10 >>>

dable para la vista. Java incluye tambin un sistema para cambiar la apariencia del interfaz por si no os gusta la que arranca por defecto.

Programacin
Al igual que en Python, para nuestras aplicaciones, lo mas cmodo es hacer que el intrprete ejecute un fichero (o varios) de cdigo. Jython no tiene ningn tipo de extensin establecida para los ficheros, y lo ms normal es usar la misma que Python .py para tener nuestros ficheros de cdigo bien diferenciados de los dems.

Como podis ver resulta muy sencillo a la vez de que swing resulta muy agra-

Listado 3: lrss.py
01 from xml.dom import minidom 02 import urllib 03 04 DEFAULT_NAMESPACES = \ 05 (None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0 06 'http://purl.org/rss/1.0/', # RSS 1.0 07 'http://my.netscape.com/rdf/si mple/0.9/' # RSS 0.90 08 ) 09 DUBLIN_CORE = ('http://purl.org/dc/elements/ 1.1/',) 10 11 def load(rssURL): 12 return minidom.parse(urllib.urlopen(r ssURL)) 13 14 def getElementsByTagName(node, tagName, possibleNamespaces=DEFAULT_NAM ESPACES): 15 for namespace in possibleNamespaces: 16 children = node.getElementsByTagNameNS(na mespace, tagName) 17 if len(children): return children 18 return [] 19 20 def first(node, tagName, possibleNamespaces=DEFAULT_NAM ESPACES): 21 children = getElementsByTagName(node, tagName, possibleNamespaces) 22 return len(children) and children[0] or None 23 24 def textOf(node): 25 return node and "".join([child.data for child in node.childNodes]) or "" 26 27 if __name__ == '__main__': 28 import sys 29 rssDocument = load(sys.argv[1]) 30 fn = open('news.txt','w') 31 Noticia="" 32 for item in getElementsByTagName(rssDocume nt, 'item'): 33 Noticia = 'Title: __' + textOf(first(item, 'title'))+ "__\n" 34 Noticia = Noticia + 'Link: \n '+ textOf(first(item, 'link'))+ "\n" 35 Noticia = Noticia + 'Description: \n\n ' + textOf(first(item, 'description'))+ "\n" 36 Noticia = Noticia + '\nDate: ' + textOf(first(item, 'date', DUBLIN_CORE))+ "\n" 37 Noticia = Noticia + '\nAuthor: '+ textOf(first(item, 'creator', DUBLIN_CORE))+ "\n" 38 Noticia = Noticia + "--------------------------------------\n" 39 fn.write(Noticia) 40 fn.close()

Para usar las libreras de Java, lo primero que tenemos que hacer es importarlas al estilo de siempre de Python. Como hemos visto en el ejemplo de antes, para importar las libreras de swing, basta con importar lo que necesitemos. Imaginad que necesitamos la clase Vector, que esta dentro del paquete de utilidades, bien podemos hacer import java.util as util o bien directamente import java.util.vector as vector, y ya tendremos acceso a esa clase. Para utilizarla bastara con llamar a su constructor (os recuerdo que tengis siempre a mano la documentacin del API de Java) con l, crearemos una ocurrencia vector (en este caso), pepe = util.vector() y una vez creada, podemos acceder a cualquiera de sus mtodos directamente en la ocurrencia que acabamos de crear, pepe.add(Hola) que, para los que no estn muy familiarizados con Java, aade un objeto de tipo String (cadena de caracteres) al vector. Cada ocurrencia de Java tiene el mismo funcionamiento en Jython. Es importante que tengis esto en cuenta. Ahora vamos a mezclar un poco de cada (Figura 2). Para ello voy a crear tres botones, a cada uno lo llamaremos de una forma distinta y les aadiremos un listener (para coger los eventos que produce cada botn) de forma que al pulsar en cada uno, se escriba su nombre en un cuadro de texto. Veamos como se hace esto en el Listado 1. Es sencillo verdad?, si os dais cuenta, para crear los botones he usado cdigo propio de Python usando una lista con los nombres de los botones y crendolos con un bucle for, dentro del cual llamo al constructor de JButton, pasndole unos argumentos, y aadindolos en el panel mediante el mtodo .add() que implementa JPanel. Bueno, espero que os haya gustado el ejemplo porque ahora viene nuestra aplicacin en serio.

Lector de Noticias RSS -JyRSSPuede que algunos de vosotros os preguntis que es RSS. RSS no es ms que un fichero .xml con una serie de etiquetas. stas siguen un estndar definido por xml.com para transmitir pequeas noticias, por ejemplo, a travs de Internet, de forma que no haga falta abrir un navegador para leerlas, slo bastara con usar una aplicacin que

46

Nmero 04

www.linux-magazine.es

043-047_Python_Linux4

15.02.2005

11:06 Uhr

Pgina 47

Python

DESARROLLO

Figura 2: Ejemplo con botones Swing.

descargue y prepare la noticia para que la podamos leer, como hace nuestra aplicacin JyRSS. Para empezar, necesitamos el cdigo que hemos mencionado al principio del artculo. Este cdigo ser el encargado de descargar y parsear el fichero RSS con las noticias, de forma que guardar en un fichero, el contenido ya parseado del documento RSS para que nuestra aplicacin pueda cargar su contenido dentro de un cuadro de texto. Tiene algunas limitaciones y es que no soporta todas las codificaciones de texto, por lo que os recomiendo que cuando lo probis, usis direcciones extranjeras, a ser posible en ingls, como Slashdot.com (http://www. slashdot.com/index.rss) ya que con algunos blogs en castellano, como barrapunto.com, no funciona correctamente debido a una serie de caracteres contenidos en el documento. JyRSS constar de varias partes. Un JFrame (ver Listado 1) donde irn embebidos el Panel de botones y los cuadros de texto. Uno de los cuadros de texto es un JList donde mostraremos los nombres de los sitios que contienen las noticias y el otro un JEditorPane donde se mostraran las noticias. Adems ambos hacen uso de JScrollPane para que puedan hacer scroll en caso de que haya texto que ocupe toda la pantalla. Tambin hacemos uso del JMenu y de JMenuBar para crear el pequeo men archivo, donde est la opcin de guardar, que guardar en dos ficheros (uno con los nombres de los sitios y otro las urls de cada sitio) todos los sitios web que le hayamos aadido. Este men no es nada necesario, pero queramos incluirlo para que vierais lo fcil que es crearlo. El panel de botones tendr tres JButtons, uno para aadir una nueva url a la lista, uno para borrar una url de la lista y otro que lanzar el pequeo parser de RSS (lrss.py) y nos mostrar las noticias de cada sitio que aparecern en el JEditorPane. Tambin se hace uso de la clase Vector. Usaremos dos vectores, uno para guardar los nombres y otro para las

Figura 3: Buscador desde la lnea de comandos.

direcciones. El vector de nombres se lo pasaremos a la ocurrencia JList para que aada todos los nombres de los sitios en pantalla. Usaremos el paquete java.lang para implementar la funcin de salir de la ventana al pulsar la x de nuestra aplicacin (no se implementa por defecto). De Python, haremos uso del paquete os, desde el que nos valdremos de os.path.exists() para comprobar si existe el fichero de nombres al arrancar la aplicacin y de os.system() que ejecutara el script Python que leer las noticias. ste guardar las noticias en un fichero, que luego leer nuestra aplicacin. No os preocupis si veis que tarda un poco, eso es por dos motivos, tiene que descargar el fichero de Internet, y adems tiene que parsearlo y las libreras que utiliza (minidom) son bastante lentas. Usaremos tambin las utilidades de escritura y lectura de ficheros (open(), write(), read(), etc) para manejarnos con ellos. Podemos ver el resultado en la Figura 3. Como veis, programar java con Jython no resulta para nada difcil, al contrario, resulta muy cmodo, y desde luego mucho mas sencillo que Java. En el Listado 3 encontrareis el cdigo Python de la pequea aplicacin externa. Pongo los nombres de las clases y paquetes de Java que se van a usar, para que os vayan sonando cuando vayis leyendo el cdigo. As podris buscar ms rpido en la API de Java y no tendris problemas para encontrarlas. Vuelvo a hacer hincapi en que es necesario que lo tengis.

servir para practicar con el cdigo que os dejamos. Por ejemplo, hacer que el cuadro JEditorPane os cambie la apariencia del texto (negrita, cursiva, etc), que cada vez que pulsis sobre un nombre en la JList lea la noticia directamente (deberis trabajar con el listener de JList), aadir la opcin de guardar las noticias del sitio que mas os gusten, etc

Entornos de programacin Jython.


Mucha gente prefiere trabajar con IDEs (interfaz para el desarrollo de aplicaciones) a la hora de programar. Actualmente no he encontrado an ninguno que sea exclusivamente para desarrollar en Jython. Lo que s existe, son plugins que instalamos en otros IDEs y que nos permiten trabajar con este lenguaje. Podemos encontrar diferentes plugins para dos de los IDEs ms populares, uno para Netbeans (ver [4]) que os podis bajar desde la aplicacin de actualizacin que lleva implementada. Y luego tenis otro para Eclipse (ver [5]), llamado Red Robin que podis encontrar en [6]. Tanto en la web de Netbeans, como en la web de Red Robin, se explica como debemos instalarlos. s

RECURSOS
[1] Pgina de Jython: http://www.jython.org [2] Descarga de Java: http://java.sun.com [3] Cdigo original del programa: http:// www.xml.com/lpt/a/2002/12/18/ dive-into-xml.html [4] Plugins de Netbean: http://www. netbeans.org [5] IDE Eclipse: http://www.eclipse.org [6] Plugin Jython para Eclipse: http://home. tiscali.be/redrobin/jython/

Jos Pedro Orantes est cursando 3

Mejoras para JyRSS


Es obvio que a este cdigo le faltan muchas cosas adems de que debe tener varios bugs como por ejemplo que al pulsar el botn Leer cuando no hay ninguna url y/o ningn nombre, Java lanza una excepcin. Os animamos a que lo depuris. Os sugerimos que le hagis algunas mejoras, ya que de esta manera os

de Ingeniera Tcnica en Informtica

LOS AUTORES

de Sistemas y desde hace tiempo utiliza linux como herramienta de trabajo. Jos Mara est realizando el Proyecto Fn de Carrera de Ingeniera Tcnica en informtica de Sistemas y lleva 7 aos usando y desarrollando software libre, y desde hace dos en FreeBSD.

www.linux-magazine.es

Nmero 04

47

Вам также может понравиться