Python et la création d’un interpréteur

Il est souvent utile de créer des outils en ligne de commande du type interpréteur.

Un interpréteur va plus loin qu’une simple ligne de commande dans le sens où il n’y a pas de scénario pré-établie.

Python comporte son propre interpréteur (à lancer en ligne de commande par python) et on peut utiliser ce dernier pour créer sont interpréteur.

import cmd
import string, sys

class CLI(cmd.Cmd):

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = '> '

    def do_hello(self, arg):
        print "hello again", arg, "!"

    def help_hello(self):
        print "syntax: hello [message]",
        print "-- prints a hello message"

    def do_quit(self, arg):
        sys.exit(1)

    def help_quit(self):
        print "syntax: quit",
        print "-- terminates the application"

    #integre function et help
    def do_greet(self, person):
        """greet [person]
        Greet the named person"""
        print person

    #ne fait rien si ligne vide
    def emptyline(self):
        pass

    # shortcuts
    do_q = do_quit

#
# try it out

cli = CLI()
cli.cmdloop()

ce qui donne

$ python cmd-example-1.py
> help

Documented commands (type help <topic>):
========================================
hello           quit

Undocumented commands:
======================
help            q

> hello world
hello again world !
> q

Note

cet interpréteur comporte déjà la gestion des aides, historiques, ...

Une documentation complète sur cette classe est disponible sur le lien http://docs.python.org/library/cmd.html

Il est aussi possible d’utiliser un interpréteur avec une ligne de commande (mode “une commande”)

import cmd

class InteractiveOrCommandLine(cmd.Cmd):
    """Accepts commands via the normal interactive prompt or on the command line."""

    def do_greet(self, line):
        print 'hello,', line

    def do_EOF(self, line):
        return True

if __name__ == '__main__':
    import sys
    if len(sys.argv) > 1:
        InteractiveOrCommandLine().onecmd(' '.join(sys.argv[1:]))
    else:
        InteractiveOrCommandLine().cmdloop()