#!/usr/bin/env python3 ## console.py ## Author: James Thiele ## Date: 27 April 2004, 21 April 2013 ## Version: 1.0 ## Location: http://www.eskimo.com/~jet/python/examples/cmd/ ## Source: http://code.activestate.com/recipes/280500-console-built-with-cmd-object/ ## License: PSF ## Copyright (c) 2004, James Thiele, 2013, Arne Babenhauserheide import os import cmd import readline import subprocess import wisp class Console(cmd.Cmd): def __init__(self): cmd.Cmd.__init__(self) self.code = "" self.prompt = "=>> " self.intro = "Welcome to console!" # defaults to None ## Command definitions ## def do_hist(self, args): """Print a list of commands that have been entered""" print(self._hist) def do_exit(self, args): """Exits from the console""" return -1 # Command definitions to support Cmd object functionality # def do_EOF(self, args): """Exit on system end of file character""" return self.do_exit(args) def do_shell(self, args): """Pass command to a system shell when line begins with '!'""" os.system(args) def do_help(self, args): """Get help on commands 'help' or '?' with no arguments prints a list of commands for which help is available 'help <command>' or '? <command>' gives help on <command> """ # The only reason to define this method is for the help text in the doc string cmd.Cmd.do_help(self, args) # Override methods in Cmd object # def preloop(self): """Initialization before prompting user for commands. Despite the claims in the Cmd documentaion, Cmd.preloop() is not a stub. """ cmd.Cmd.preloop(self) # sets up command completion self._hist = [] # No history yet self._locals = {} # Initialize execution namespace for user self._globals = {} def postloop(self): """Take care of any unfinished business. Despite the claims in the Cmd documentaion, Cmd.postloop() is not a stub. """ cmd.Cmd.postloop(self) # Clean up command completion print("Exiting...") def precmd(self, line): """ This method is called after the line has been input but before it has been interpreted. If you want to modifdy the input line before execution (for example, variable substitution) do it here. """ self._hist += [line.strip()] return line def postcmd(self, stop, line): """If you want to stop the console, return something that evaluates to true. If you want to do some post command processing, do it here. """ return stop def emptyline(self): """Do nothing on empty input line""" self.default("") def default(self, line): """Called on an input line when the command prefix is not recognized. In that case we execute the line as Python code. """ self.code += "\n" + line if self.code.endswith("\n\n"): lisp = wisp.wisp2lisp(self.code) print (self.code) print (lisp) subprocess.call(["guile", "--", lisp]) self.code = "" def parseline(self, line): """Parse the line into a command name and a string containing the arguments. Returns a tuple containing (command, args, line). 'command' and 'args' may be None if the line couldn't be parsed. """ #line = line.strip() if not line: return None, None, line elif line[0] == '?': line = 'help ' + line[1:] elif line[0] == '!': if hasattr(self, 'do_shell'): line = 'shell ' + line[1:] else: return None, None, line i, n = 0, len(line) while i < n and line[i] in self.identchars: i = i+1 cmd, arg = line[:i], line[i:].strip() return cmd, arg, line if __name__ == '__main__': console = Console() console.cmdloop()