read input for cmd.Cmd from file

Peter Otten __peter__ at web.de
Fri Jun 3 03:59:11 EDT 2005


Achim Domma (Procoders) wrote:

> I'm writing a simple shell using cmd.Cmd. It would be very usefull if I
> could read the commands as batchjob from a file. I've tried the following:
> 
> class MyShell(cmd.Cmd):
>      def __init__(self,stdin):
>          cmd.Cmd.__init__(self,stdin=stdin)
>          ...
>      ...
> 
> if __name__=='__main__':
>      if len(sys.argv)==2:
>          shell=MyShell(file(sys.argv[1]))
>      else:
>          shell=MyShell(sys.stdin)
>      shell.cmdloop()
> 
> Calling 'myshell.py inputfile' with an invalid inputfile, I get an
> error, so it seems that the file is opened. But the shell starts as
> usuall, ignoring the content of the file. There is no output and no
> errors (if I write nonsens into the inputfile).

[While I'm at it, duplicated from de.comp.lang.python]

Interesting idea. The simplest approach I found was to feed the file
directly into the cmdqueue-Attribute:

import cmd

class Cmd(cmd.Cmd):
    def do_this(self, arg):
        print "this>", arg
    def do_that(self, arg):
        print "     <that", arg
    def do_quit(self, arg):
        print "That's all, folks"
        return True

if __name__ == "__main__":
    import optparse
    parser = optparse.OptionParser()
    parser.add_option("-i", "--interactive", action="store_true")
    options, args = parser.parse_args()
    
    c = Cmd()
    try:
        filename, = args
    except ValueError:
        pass
    else:
        c.cmdqueue.extend(file(filename))
        if not options.interactive:
            c.cmdqueue.append("quit\n")
    
    c = c.cmdloop()

$ cat batch.txt
this
that
that
oops
that

$ python2.4 batch_cmd.py batch.txt
this>
     <that
     <that
*** Unknown syntax: oops
     <that
That's all, folks

If you want to continue the session in the interaktive mode:

$ python2.4 batch_cmd.py batch.txt -i
this>
     <that
     <that
*** Unknown syntax: oops
     <that
(Cmd)


Peter




More information about the Python-list mailing list