Cmd: Creando una consola interactiva con Python

Python

Python

Siguiendo con los ejemplos de los grandes recursos que ofrece la standard library de Python, así como el otro día hablé sobre BaseHTTPServer, hoy voy a hablar de Cmd.

Cmd es un módulo que nos permite crear una consola interactiva, como la propia consola de Python, en unas pocas líneas. La consola incluye manejo de distintos prompts, hooks para la ejecución de comandos, manejo de historial, ayuda general y por comando, y autocompletado de comandos y parámetros, etc. Lo único que tenemos que hacer para implementarla es extender la clase cmd.Cmd e implementar métodos do_* para los distintos comandos que queramos definir.

Veamos las opciones disponibles con un ejemplo muy sencillo:

# -*- coding: utf-8 -*-
import cmd

class Console(cmd.Cmd):

    prompt = "> "

    _colors = {‘red’: ‘#FF0000′,
               ‘white’: ‘#FFFFFF’,
               ‘black’: ‘#000000′}

    def __init__ (self):
        """Constructor"""
        cmd.Cmd.__init__(self)

    def do_hello (self, name):
        """Says hello to someone"""
        print "Hello %s!" % name

    def do_get_color (self, color):
        """Prints out the hex representation of a color"""
        if color in self._colors:
            print "%s: %s" % (color, self._colors[color])
        else:
            print "I don’t know: %s" % color

    def complete_get_color (self, text, line, begidx, endix):
        """Complete function for get_color"""
        return [i for i in self._colors if i.startswith(text)]

    def do_quit (self, s):
        print "Bye, bye…"
        return True

    def help_quit (self):
        print "Quits the console"

    do_EOF = do_quit
    help_EOF = help_quit

if __name__ == "__main__":
    console = Console()
    try:
        console.cmdloop("Hola!")
    except KeyboardInterrupt:
        console.do_quit(None)

Inicialización

Lo primero que hacemos es definir la clase Console que extiende cmd.Cmd. Luego definimos la propiedad pública “prompt”, que será el prompt de la consola (por default “(Cmd)”).

Un método básico

Luego tenemos el método do_hello que toma un argumento y le dice hola al argumento. Notesé que el texto que definimos en el comentario (“Says hello to someone”), además de ser la documentación de la función es tomada por Cmd para mostrarlo como ayuda del comando. Si en la consola ponemos “? hello” o “help hello”, se imprimirá esa cadena.

Autocompletado

A continuación tenemos el método do_get_colors que imprime el código hexadecimal de un color, según el diccionario _colors. Además de tener su texto de ayuda, a continuación tenemos el método complete_get_colors que lo que hace es manejar el autocompletado de los parámetros. Aquí lo que hacemos es ver el texto que se tipeó y devolver todas las claves del diccionario _colors que empiecen con ese texto.

Salir de la consola

Para salir del loop de la consola un método tiene que devolver True. Para ello definimos el método do_quit. Aquí imprimimos un saludo y salimos. Las novedades son, por un lado, la función help_quit que cumple la misma función que el docstring: imprime la ayuda del comando quit. Y además duplicamos la función do_quit como do_EOF (y help_quit como help_EOF). De esta forma, cuando la consola reciba EOF (es decir, Ctrl+D) ejecutará do_quit y saldrá.

Ejecutando la consola

Por último, al final del código instanciamos la clase Console y ejecutamos el método cmdloop() que inicia el loop de la consola. De paso agregamos el handling de la excepción KeyboardInterrupt (es decir, Ctrl+C) para que ejecute do_quit y cierre la consola adecuadamente.

Otro ejemplo

Así como hice la última vez, les dejo otro ejemplo más completo en el que anduve trabajando. En este caso es parte del código de mi modesto proyecto python-directadmin. Se trata de DAConsole, una pequeña consola interactiva para interactuar con Directadmin, donde implemento todas estas cosas vistas aquí, además de la posibilidad de crear consolas anidadas.

Ver código de DAConsole.

Referencias

Comentar

5 Comentarios.

  1. Yo entiendo mal o me decis que con esto puedo crear una consola cmd que además de hacer lo que hace el cmd básico de Windows puede agregar por ejemplo, el autocompletado de comandos? de ser así me interesa pero entiendo poco de programación…..

  2. En teoría sí, pero antes de hacer eso te diría que averigües si no hay algo hecho ya, porque sino vas a tener que ponerte a implementar un montón de cosas de cero.

  3. Vos sabes que lo que he encontrado que ya estaba hecho lo único que autocompleta son los comandos (y solo algunos) pero no autocompleta las variables como lo hace Linux, me interesa porque estoy estudiando una carrera técnica en telecomunicaciones y me gusta hacer la administración de los servidores vía consola pero se me cae un egg escribir todos los comandos letra por letra, en Windows Server hecho mucho de menos el tabulador como el que si tengo en las consolas Linux y en la consola de los routers Cisco…te judería mucho hacer un manual más extenso al respecto, claro si contas con el tiempo, porque a mí me interesa pila pero soy una tripa en programación….te lo agradecería eternamente….

  4. Disculpa, otra consulta, en caso de querer implementar esto que pones en este manual, ese código de programación, donde lo debo pegar? que es lo que debo hacer con el, tengo que instalarle algo al Windows 7 64 bit para que esto funcione? como te dije, soy una tripa para la programación y el desarrollo….

  5. El tema es que administrar un Windows por consola es algo que de entrada viene mal parido jeje. Windows es un sistema operativo que no está pensado para ser administrado por una interfaz en modo texto. No sé cómo podrías hacer para implementar una consola que te sirva. No puedo hacerlo porque no tengo tiempo, no uso Windows, y realmente tampoco me interesa.

    Para programar en Python sobre Windows seguramente vas a encontrar muchas guías en Internet. Básicamente el código lo editás con cualquier editor de texto (sea el notepad, el notepad++ o un IDE más completo), y después necesitás instalar Python para poder ejecutar tus programas.

Comentar


[ Ctrl + Enter ]