Re: crear una sesión interactiva

Medardo Rodriguez med.swl en gmail.com
Sab Ago 16 22:10:06 CEST 2008


2008/8/16 Jose Caballero <jcaballero.hep en gmail.com>:
> me gustaría desarrollar una aplicación que permita crear una sesión
> interactiva donde los usuarios puedan ejecutar comandos. Algo como esto
>
> $ my_application.py
> my_app > init
> my_app > bla bla bla
> my_app > exit
> $

...
> Si alguien conoce algún link donde pueda ver un ejemplo sencillo, pero que
> sea más o menos profesional (fácil de ampliar en un futuro), estaré más que
> agradecido.


Se me acaba de ocurrir este ejemplo al leer tu correo:

<code>
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Copyright (C) 2008 Medardo Rodriguez

# This is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License; either
# GPL v2 or any later version.
# See the GNU General Public License for more details.

'Este es un ejemplo que acabo de hacer la la lista de Python en Español'

from random import randint

prompt1 = '$ '
prompt2 = '> '

def DoDefault(cmd, args):
    'Se ejecuta cuando se entra un comando malo'
    answers = ('Usted debe estar bobeando',
               'Mire bien lo que escribe',
               'Pida ayuda',
               'definitivamente no sabe usar una PC')
    print prompt2, 'No entiendo el comando «%s» %s' % (cmd, args)
    print '      %s' % answers[randint(0, len(answers) - 1)]

def DoSee(args):
    'Mira objetos en la habitación actual'
    print prompt2, 'Usted está mirando los siguientes objetos: %s' % args

def DoPisi(args):
    'Para errores de «mirar»'
    print prompt2, '¿Va a orinar o está tratando de ver: %s?' % args

def DoHelp(args):
    'Muestra ayuda del sistema'
    if args:
        print prompt2, 'Este programa no necesita mucha ayuda'
        print prompt2, 'Y menos de los comandos: %s' % args
    else:
        print prompt2, 'Los comandos instalados son:'
        for cmds, action in registry:
            for cmd in cmds:
                print '   * %s' % cmd
            print '       %s' % action.__doc__

def DoExit(args):
    'Salir del sistema interactivo'
    if args:
        print prompt2, '«%s» no hacen falta para irse' % args
    else:
        global exit
        print prompt2, 'hasta luego!'
        exit = True


registry = ((('mirar', 'ver'), DoSee),
            (('miar',), DoPisi),
            (('ayuda', 'help', '?'), DoHelp),
            (('salir', 'adios', 'quit'), DoExit),
            # Registre cuantas otras acciones quiera
           )

actions = {}

for cmds, action in registry:
    for cmd in cmds:
        actions[cmd] = action

def SplitCommand(line):
    list = line.split(' ', 1)
    return (list[0].lower(), list[1] if len(list) == 2 else '')


if __name__ == '__main__':
    print 'Puede pedir «ayuda»'
    exit = False
    while not exit:
        command = raw_input(prompt1).strip()
        if command:
            cmd, args = SplitCommand(command)
            action = actions.get(cmd)
            if action:
                action(args)
            else:
                DoDefault(cmd, args)
</code>

Saludos
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es