Clase 5: CLI, templates y excepciones



Documentos relacionados
Clase 3: Archivos (texto, csv, dbf, Excel)

SHELL SCRIPTING: ANÁLISIS DE ARGUMENTOS

Curso PHP Módulo 1 R-Luis

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Se guardan en archivos con extencion c y los cabezales con extension h

Ejercicios - Persistencia en Android: ficheros y SQLite

Nano Taller de Python

Introducción a la Programación en MATLAB

Iniciando con Oracle. Índice de contenido. Ingresando a Oracle. Cambiando Su Contraseña. Ingresando un Comando SQL en SQL*Plus

Modulo 1 El lenguaje Java

Tutorial: Python + Soap Web Service. Daniel Montenegro Cordero

GUÍA Nro. 1 TECNOLOGÍA DE INTERNET. TIII PIII

TRABAJO PRACTICO Nº 1 Formateador de contenidos CSV

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

ReStructuredText, Sphinx, Sagepedia Cómo escribir documentación para python y Sage

Programación: QBASIC

Acronis License Server. Guía del usuario

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:

TUTORIAL DE PHP. M. en C. Erika Vilches. Parte 1.

MySQL: Guía de Referencia

Programando con Pl/Python

CURSO PROFESIONAL DE PYTHON MÁSTER EN DESARROLLO DE APLICACIONES WEB CON JAVA ENTERPRISE EDITION

La utilización de las diferentes aplicaciones o servicios de Internet se lleva a cabo respondiendo al llamado modelo cliente-servidor.

Sintaxis y Convenciones de Java. M. en C. Erika Vilches

Tutorial: Cómo realizar tu primer programa en C++ En el Sistema Operativo Windows

Uso de archivos en C++

Estructuras de Datos y Algoritmos Tecnólogo en Informática

Introducción a PHP. * No es necesario declarar previamente las variables.

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Tutorial: Primeros Pasos con Subversion

Manejo de datos BLOB con PHP y MySQL

Apuntes de ACCESS. Apuntes de Access. Campos de Búsqueda:

Programación I: Funciones y módulos

Breve manual de Doxygen

Elementos léxicos del lenguaje de programación Java

Clase 4: Un poco más de Python

Operación Microsoft Access 97

Contenidos. Archivos en C++ Archivos en C++ Introducción

APRENDE A CREAR UNA PÁGINA WEB CON HTML

TUTORIAL DE PHP. M. en C. Erika Vilches. Parte 2.

Modo básico de funcionamiento del módulo Velneo vmodapache V7

MANUAL DE LA CONFIGURACIÓN Y USO DEL MÓDULO DE ASM PARA OPENCART

En el presente capítulo se describe la programación del instrumento virtual y cómo

TEMA 9 CREACIÓN DE PÁGINAS WEB

Son objetos cuya función es el tratamiento de varios registros exclusivamente durante la ejecución de un programa.

Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos.

Acceso a bases de datos en Perl

INYECCIóN DE CóDIGO EN APLICACIONES PHP. Autor: Iñaki Rodriguez (2005)

PSI Gestión es un sistema multiusuario que le permite 2 tipos de configuraciones:

MANUAL PARA LA ADMINISTRACIÓN DE ARCHIVOS Y CORREO ELECTRÓNICO

TEMA 3: EL LENGUAJE C: PRESENTACIÓN

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Manual de usuario de IBAI BackupRemoto

PROGRAMACIÓN EN PYTHON 2. Clara Higuera Laboratorio Integrado de Biofísica y Bioinformática Nov-2015

Conciliación bancaria en CheqPAQ Cargado de estado de cuenta

Consultas con combinaciones

Los autores del presente documento lo ha publicado bajo las condiciones que especifica la licencia

Ejemplos básicos de webmathematica para profesores

La plantilla propone aprovechar esta estructura en común y sólo modificar el contenido del área del documento que sea diferente.

Práctica 1 - Pista de Carreras Programación II

MANUAL DE USUARIO. Webservice simple para la exportación rápida de información proveniente de una base de datos. Versión 0,1,1

Guía a IReport y HQL. Conexión a HSQL utilizando SQL.

Curso Online de Microsoft

XML. Escuela Técnica Superior de Ingeniería de Telecomunicación Universidad Rey Juan Carlos. Marzo de gsyc-profes (arroba) gsyc.urjc.

2.1.- EJEMPLO DE UN PROGRAMA FORTRAN

INSTRUCTIVO DEL COMANDO MAKE

Introducción al lenguaje Java

Introducción a PostgreSQL con PHP

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

2. Estructura de un programa en Java

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Apéndice 5 Manual de usuario de ColeXión. ColeXión 1.0. Manual de usuario

!" #$!"# $ % &!" ' $ *()"! $ ' + ), -./#" # $ $ + %& $ '00( $ / 0+), 0""(# $ / / ' /3 ' ' - 0

TP 0 - Implementación de codificador y estructura básica. BitsTranslation. 1.0

Preliminares. Tipos de variables y Expresiones

Lenguaje de Programación: Go

TIPOS DE VARIABLES EN PHP. DECLARACIÓN Y ASIGNACIÓN. LA INSTRUCCIÓN ECHO PARA INSERTAR TEXTO O CÓDIGO. (CU00816B)

Manual de Administración de Correo Electrónico

PRIMERA EVALUACIÓN. Realiza un conversor de números decimales a binario. La entrada será por parámetros.

Informe de Segunda Presentación

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

Carmen. Estándares de codificación. Manuel Arias Calleja

INSTALACIÓN DE LOS MÓDULOS DEL ERP AbanQ

Manual de Instalación. Sistema FECU S.A.

Introducción a Java LSUB. 15 de enero de 2015 GSYC

Desarrollo Web en Entorno Servidor

Uso básico de la terminal

Curso de PHP con MySQL Gratis

Cómo crear y configurar un servidor FTP

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

Herramientas computacionales para la matemática MATLAB: Funciones definidas por el usuario (parte II)

Pantalla ENW URL LOGIN

7. Manejo de Archivos en C.

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Transcripción:

Clase 5: CLI, templates y excepciones CLI: Línea de comandos Consideraciones básicas Shebang: Primera linea que se usa en *nix para que el SO sepa con que interprete ejecutar dicho archivo. Ejemplo de shebang usado en programas Python: #!/usr/bin/env python Esta línea invoca al intérprete disponible "por defecto". Para especificar alguna versión o instalación de Python en particular: #!/usr/bin/python #!/usr/bin/python2.6 Ademas el archivo tiene que estar marcado como ejecutable (chmod a+x archivo.py). Tener en cuenta estas instrucciones al correr un script en un servidor. Otra instrucción para incluir al principio de un script es el encoding, útil cuando se incluyen símbolos no ASCII en el código fuente: # -*- coding: iso-8859-15 -*- o # -*- coding: UTF-8 -*- Atención! El enconding del documento es para el archivo del programa. Sirve para que el interprete sepa el encoding del código fuente. No tiene relación con el o los encoding que leerá o escribirá el programa. Argumentos via CLI (modo simple) La manera mas básica es usando sys.argv: import sys print sys.argv sys.argv contiene una lista de strings, cada str es un argumento pasado en la linea de comandos, salvo el primer elemento que es el nombre del programa. Código de ejemplo:

#!/usr/bin/python import sys def main(): print 'Hola', sys.argv[1] if name == ' main ': main() Uso: $ programa.py Seba Hola Seba Entrada via tuberias (pipelines) Definición "En informática, una tubería (pipe o ' ') consiste en una cadena de procesos conectados de forma tal que la salida de cada elemento de la cadena es la entrada del próximo." (Fuente: Colaboradores de Wikipedia. Tubería (informática) [en línea]. Wikipedia, La enciclopedia libre, 2009 [fecha de consulta: 19 de septiembre del 2009]..) Para leer datos entrados con pipe, usar sys.stdin que es el equivalente a una referencia a un archivo (filehandle). El siguiente código lee un archivo que entra via la entrada estándar (STDIN): #!/usr/bin/python import sys def main(): print 'El contenido es:' for linea in sys.stdin: print linea, if name == ' main ': main() Una manera de ejecutarlo: $ programa.py < 1.txt Argumentos via CLI (avanzado) Para tener un mejor control de los parametros que pueden entrarse via línea de comandos, existe el módulo optparse. Este módulo tiene soporte de argumentos, opciones y ayuda. Ayuda a que no tenemos que preocuparnos por la posición de los argumentos y se adapta al estilo habitual de los programas de línea de comando usados en *nix.

Terminología (en el contexto de optparse) Argumentos: Strings ingresados en la línea de comandos, recuperables via sys.argv[1:]. Opciones: Un argumento que es optativo. Normalmente tienen un guión (-) seguido de una letra, o 2 guiones (--) seguida de una palabra. Argumento de opción: Un argumento que sigue a una opción. Ejemplo: -f archivo.txt --file archivo.txt Argumento posicional: Los argumentos que quedan luego de que se procesan las opciones. Son argumentos que los programas requieren de manera obligatoria. Uso de optparse Como primera medida hay que importar e instanciar OptionParser: from optparse import OptionParser parser = OptionParser() Luego hay que agregar opciones con el método add_option, por ejemplo: parser.add_option("-i", "--input", dest="input_file", action="store", type="string", help="input file. ") Los primeros argumentos son las cadenas que serán reconocidas en la línea de comandos ("-i" e "--input" en este caso). El argumento con clave dest indica el nombre con el que será reconocido en el programa. El argumento con clave help es la linea de ayuda que el usuario verá en la línea de comando asociada con esa opción. action es opcional (por defecto tiene el valor de "store") e indica como guardar el valor ingresado. En este caso (cuando action="store") se guarda directamente el valor ingresado. Si action="store_const", se guarda una constante que tiene que ser especificada con el argumento "const". Un caso particular de "store_const" es "store_true" que guarda True en la variable asociada en dest. Otro valor posible para action es "append", que agrega un elemento a una lista de destino. El argumento type indica el tipo de datos que almacena, por defecto es "string". Mas ejemplos de add_option: parser.add_option("-q", "--quiet", action="store_const", const=0, dest="verbose") parser.add_option("-v", "--verbose", action="store_const", const=1, dest="verbose") parser.add_option("--noisy", action="store_const", const=2, dest="verbose") parser.add_option("-t", "--tracks", action="append",

type="int") Una vez que se definen las opciones, hay que hacer el procesamiento: options, args = parser.parse_args() Ejemplo de código integrador: #!/usr/bin/env python import sys from optparse import OptionParser import string usage = "usage: %prog [password_file] [dictionary_file]\n" usage += "or %prog [options] [password_file]\n\n" usage += "Type %prog -h for more information" parser = OptionParser(usage, version="%prog 1.0") parser.add_option("-i", "--input", dest="input_file", help="input file.") parser.add_option("-d", "--dictionary", dest="dict_file", help="use a dictionary file.") parser.add_option("-a", "--aspell", dest="aspell", help="use aspell dictionary.") opts, args = parser.parse_args() if opts.input_file: fh = open(opts.input_file,'u') elif args: fh = open(args[0],'u') elif sys.stdin: fh = sys.stdin parser.error("ingresá archivo") if len(args)==2: fd = open(args[1],'u') elif opts.dict_file: fd = open(opts.dict_file,'u') elif opts.aspell: try: import aspell except: parser.error("instala aspell-python") parser.error('ingresa un archivo de diccionario o un diccionario tipo aspell') Mas información: http://docs.python.org/library/optparse.html

Salida de datos usando plantillas (templates) Hay varios sistemas de templates disponibles para Python (PML, Spyce, Django template system, Mako, Jinja 2 y Cheetah). En este curso usamos Cheetah. Cheetah Cheetah no es parte de la biblioteca estándar, por lo que hay que descargarlo e instalarlo por separado. Usando easy_install: # easy_install cheetah O usando el gestor de paquetes: # apt-get install python-cheetah Uso de Cheetah Hay que importar e instanciar el objeto Template. Los parametros son: Referencia al archivo de plantilla y un argumento con clave searchlist que tiene una lista con un elemento que es un diccionario con las variables que serán reemplazadas en los lugares señalados en la plantilla. Ejemplo de programa que usa Cheetah: Con el siguiente programa solo hay que cambiar una línea para que la salida sea un CSV, un HTML o un SQL. Un ejemplo de separación de lógica con presentación. import random from Cheetah.Template import Template # Hacer datos al azar data = [] for x in range(50): point = random.randint(5,200) data.append((x+1,point)) # Guardar como archivo CSV dataout = Template(open('data_csv').read(), searchlist=[{'data': data}]) open('data.csv','w').write(str(dataout)) # Guardar como tabla HTML dataout = Template(open('data_html').read(), searchlist=[{'data': data}]) open('data.html','w').write(str(dataout)) # Guardar como query SQLite dataout = Template(open('data_sql').read(), searchlist=[{'data': data}]) open('data.sql','w').write(str(dataout)) Ejemplo de archivos de plantillas: Archivo data_csv: #for $d in $data: $d[0],$d[1] #end for Archivo data_html:

<html><head></head> <body> <table border=1> <tr><th>orden</th><th>valor</th></tr> #for $d in $data: <tr><td>$d[0]</td><td>$d[1]</td></tr> #end for </table> </body></html> Archivo data_sql: BEGIN TRANSACTION; #for $d in $data: INSERT INTO "mytable" VALUES($d[0],$d[1]); #end for COMMIT; A tener en cuenta: En Cheetah los templates son archivos de texto con marcas. La marca insertar código es #. Las variables van precedidas con $. Como no se puede identar, hay que marcar el fin de los ciclos de manera expícita (#end if, #end for). Se puede insertar un template en otro. Los templates pueden ser compilados. Compilando plantillas Comando: $ cheetah-compile nombre_plant Esto genera un archivo tipo nombre_plant.py. Este archivo debe copiarse a un directorio donde pueda ser accedido como módulo (ver clase 4). Este módulo debe ser importado en el programa: from index_template import index_template as it Luego se usa de esta forma: dataout = it(searchlist=[dict]) (donde DICT es un diccionario con todas las variables a sustituir). Lenguaje de plantillas Comentarios: ## Una línea #* Multiples líneas *# Incluir archivos:

Parseados: #include nombre_archivo Sin parsear: #include raw nombre_archivo Importar módulos: #import #from xxxx import xxxxx Variables: Con $ o con ${}. Ejemplo: <title>$titulo</title> Variables auxiliares: #set $var = '' Ejemplo: #set $url = 'http://www.dominio.com' Manejo de errores Estrategias de manejo de errores: 1. Ignorar la posibilidad de error y asumir que todo funcionará como planeado. 2. Codificar de manera que se eviten todos los errores (LBYL) 3. Asumir la posibilidad de error y actuar a consecuencia (EAFP). Ej. de 1- fh = open('myfile.csv') line = fh.readline() fh.close() value = line.split('\t')[0] fw = open('other',"w") fw.write(str(int(value)*.2)) fw.close() Ej de 2- import os while True: iname = raw_input("ingresá nombre de archivo de entrada: ") on = raw_input("ingresá nombre de archivo de salida: ") if os.path.exists(iname): fh = open(iname) line = fh.readline() fh.close() if "\t" in line: value = line.split('\t')[0]

if os.access(on,os.w_ok)==0: fw = open(on,"w") if value.isdigit(): fw.write(str(int(value)*.2)) fw.close() break print("no se puede convertir a int") print("no puede escribir en el archivo de salida") print("no hay tabs") print("no existe el archivo") El problema de este método es que el tratamiento de errores dificulta el seguimiento del hilo del programa. Ejemplo general de estrategia EAFP: try: bloque de codigo 1 # codigo que puede fallar except: bloque de codigo 2 # hacer algo con el error [ bloque de codigo 3 # cuando no hay error finally: bloque de codigo 4 # codigo de limpieza] Ejemplo: try: print 0/0 except: print("operación no permitida") Como distinguir excepciones Atrapando genéricamente, esto es, atrapar cualquier expcepción sin importa ni distinguir que es lo que produce: d = {"A":"Adenina","C":"Cisteina", "T":"Timina","G":"Guanina"} try: clave = raw_input("ingrese letra: ") print d[clave] except: print "No existe ese nucleótido" Distinguiendo entre EOF y clave erronea.

try: clave = raw_input("ingrese letra: ") print(d[clave]) except EOFError: print(" Chau!") except KeyError: print("no existe ese nucleótido") Programa del ejemplo 2 con manejo de excepciones: import os, errno while True: iname = raw_input("ingresa archivo de entrada: ") on = raw_input("ingresa archivo de salida: ") try: fh = open(iname) line = fh.readline() value = str(int(line[:line.index("\t")])*.2) fw = open(on,"w") fw.write(value) except IOError, (errno,errtext): if errno==errno.eacces: print("permiso denegado") elif errno==errno.enoent: print("no existe ese archivo") except ValueError, strerror: if "substring not found" in strerror.message: print("no hay tab") elif "invalid literal for int" in strerror.message: print("no se puede convertir a int") fw.close() fh.close() break Provocando excepciones No hace falta esperar que ocurran las excepciones ya que estas pueden ser invocadas por el programador. La siguiente función llamada avg tendrá problemas con una lista vacía: >>> def avg(num):... return sum(num)/len(num)... >>> avg([]) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in avg ZeroDivisionError: integer division or modulo by zero El origen de este error no es facilmente comprensible si no se conoce el código de la función. Levantando un error apropiado podemos hacer que quede claro el problema: >>> def avg(num):... if not num:

... raise ValueError("Ingrese al menos un elemento")... return sum(num)/len(num)... >>> avg([]) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in avg ValueError: Ingrese al menos un elemento Se podría imprimir un resultado sin levantar una excepción, pero esto iría contra el principio pytónico de los errores no deben ocurrir sin que se noten, deben ser explícitos. Mas información: http://docs.python.org/tutorial/errors.html