Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
15.02.2005
11:06 Uhr
Pgina 43
Python
DESARROLLO
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
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)
023 024
025
44
Nmero 04
www.linux-magazine.es
043-047_Python_Linux4
15.02.2005
11:06 Uhr
Pgina 45
Python
DESARROLLO
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].
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
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
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
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/
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