read input for cmd.Cmd from file

  • Thread starter Achim Domma (Procoders)
  • Start date
A

Achim Domma (Procoders)

Hi,

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).

Could anybody help?

regards,
Achim
 
P

Peter Otten

Achim said:
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
 
P

Peter Otten

Achim said:
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:

[...]

Your original approach should work too if you clear the use_rawinput flag
and provide a do_EOF() method that handles the file end:

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
do_EOF = do_quit

if __name__ == "__main__":
import sys
filename = sys.argv[1]
c = Cmd(stdin=file(filename))
c.use_rawinput = False
c = c.cmdloop()

Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top