1*cda5da8dSAndroid Build Coastguard Worker"""Utilities needed to emulate Python's interactive interpreter. 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Worker""" 4*cda5da8dSAndroid Build Coastguard Worker 5*cda5da8dSAndroid Build Coastguard Worker# Inspired by similar code by Jeff Epler and Fredrik Lundh. 6*cda5da8dSAndroid Build Coastguard Worker 7*cda5da8dSAndroid Build Coastguard Worker 8*cda5da8dSAndroid Build Coastguard Workerimport sys 9*cda5da8dSAndroid Build Coastguard Workerimport traceback 10*cda5da8dSAndroid Build Coastguard Workerfrom codeop import CommandCompiler, compile_command 11*cda5da8dSAndroid Build Coastguard Worker 12*cda5da8dSAndroid Build Coastguard Worker__all__ = ["InteractiveInterpreter", "InteractiveConsole", "interact", 13*cda5da8dSAndroid Build Coastguard Worker "compile_command"] 14*cda5da8dSAndroid Build Coastguard Worker 15*cda5da8dSAndroid Build Coastguard Workerclass InteractiveInterpreter: 16*cda5da8dSAndroid Build Coastguard Worker """Base class for InteractiveConsole. 17*cda5da8dSAndroid Build Coastguard Worker 18*cda5da8dSAndroid Build Coastguard Worker This class deals with parsing and interpreter state (the user's 19*cda5da8dSAndroid Build Coastguard Worker namespace); it doesn't deal with input buffering or prompting or 20*cda5da8dSAndroid Build Coastguard Worker input file naming (the filename is always passed in explicitly). 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard Worker """ 23*cda5da8dSAndroid Build Coastguard Worker 24*cda5da8dSAndroid Build Coastguard Worker def __init__(self, locals=None): 25*cda5da8dSAndroid Build Coastguard Worker """Constructor. 26*cda5da8dSAndroid Build Coastguard Worker 27*cda5da8dSAndroid Build Coastguard Worker The optional 'locals' argument specifies the dictionary in 28*cda5da8dSAndroid Build Coastguard Worker which code will be executed; it defaults to a newly created 29*cda5da8dSAndroid Build Coastguard Worker dictionary with key "__name__" set to "__console__" and key 30*cda5da8dSAndroid Build Coastguard Worker "__doc__" set to None. 31*cda5da8dSAndroid Build Coastguard Worker 32*cda5da8dSAndroid Build Coastguard Worker """ 33*cda5da8dSAndroid Build Coastguard Worker if locals is None: 34*cda5da8dSAndroid Build Coastguard Worker locals = {"__name__": "__console__", "__doc__": None} 35*cda5da8dSAndroid Build Coastguard Worker self.locals = locals 36*cda5da8dSAndroid Build Coastguard Worker self.compile = CommandCompiler() 37*cda5da8dSAndroid Build Coastguard Worker 38*cda5da8dSAndroid Build Coastguard Worker def runsource(self, source, filename="<input>", symbol="single"): 39*cda5da8dSAndroid Build Coastguard Worker """Compile and run some source in the interpreter. 40*cda5da8dSAndroid Build Coastguard Worker 41*cda5da8dSAndroid Build Coastguard Worker Arguments are as for compile_command(). 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Worker One of several things can happen: 44*cda5da8dSAndroid Build Coastguard Worker 45*cda5da8dSAndroid Build Coastguard Worker 1) The input is incorrect; compile_command() raised an 46*cda5da8dSAndroid Build Coastguard Worker exception (SyntaxError or OverflowError). A syntax traceback 47*cda5da8dSAndroid Build Coastguard Worker will be printed by calling the showsyntaxerror() method. 48*cda5da8dSAndroid Build Coastguard Worker 49*cda5da8dSAndroid Build Coastguard Worker 2) The input is incomplete, and more input is required; 50*cda5da8dSAndroid Build Coastguard Worker compile_command() returned None. Nothing happens. 51*cda5da8dSAndroid Build Coastguard Worker 52*cda5da8dSAndroid Build Coastguard Worker 3) The input is complete; compile_command() returned a code 53*cda5da8dSAndroid Build Coastguard Worker object. The code is executed by calling self.runcode() (which 54*cda5da8dSAndroid Build Coastguard Worker also handles run-time exceptions, except for SystemExit). 55*cda5da8dSAndroid Build Coastguard Worker 56*cda5da8dSAndroid Build Coastguard Worker The return value is True in case 2, False in the other cases (unless 57*cda5da8dSAndroid Build Coastguard Worker an exception is raised). The return value can be used to 58*cda5da8dSAndroid Build Coastguard Worker decide whether to use sys.ps1 or sys.ps2 to prompt the next 59*cda5da8dSAndroid Build Coastguard Worker line. 60*cda5da8dSAndroid Build Coastguard Worker 61*cda5da8dSAndroid Build Coastguard Worker """ 62*cda5da8dSAndroid Build Coastguard Worker try: 63*cda5da8dSAndroid Build Coastguard Worker code = self.compile(source, filename, symbol) 64*cda5da8dSAndroid Build Coastguard Worker except (OverflowError, SyntaxError, ValueError): 65*cda5da8dSAndroid Build Coastguard Worker # Case 1 66*cda5da8dSAndroid Build Coastguard Worker self.showsyntaxerror(filename) 67*cda5da8dSAndroid Build Coastguard Worker return False 68*cda5da8dSAndroid Build Coastguard Worker 69*cda5da8dSAndroid Build Coastguard Worker if code is None: 70*cda5da8dSAndroid Build Coastguard Worker # Case 2 71*cda5da8dSAndroid Build Coastguard Worker return True 72*cda5da8dSAndroid Build Coastguard Worker 73*cda5da8dSAndroid Build Coastguard Worker # Case 3 74*cda5da8dSAndroid Build Coastguard Worker self.runcode(code) 75*cda5da8dSAndroid Build Coastguard Worker return False 76*cda5da8dSAndroid Build Coastguard Worker 77*cda5da8dSAndroid Build Coastguard Worker def runcode(self, code): 78*cda5da8dSAndroid Build Coastguard Worker """Execute a code object. 79*cda5da8dSAndroid Build Coastguard Worker 80*cda5da8dSAndroid Build Coastguard Worker When an exception occurs, self.showtraceback() is called to 81*cda5da8dSAndroid Build Coastguard Worker display a traceback. All exceptions are caught except 82*cda5da8dSAndroid Build Coastguard Worker SystemExit, which is reraised. 83*cda5da8dSAndroid Build Coastguard Worker 84*cda5da8dSAndroid Build Coastguard Worker A note about KeyboardInterrupt: this exception may occur 85*cda5da8dSAndroid Build Coastguard Worker elsewhere in this code, and may not always be caught. The 86*cda5da8dSAndroid Build Coastguard Worker caller should be prepared to deal with it. 87*cda5da8dSAndroid Build Coastguard Worker 88*cda5da8dSAndroid Build Coastguard Worker """ 89*cda5da8dSAndroid Build Coastguard Worker try: 90*cda5da8dSAndroid Build Coastguard Worker exec(code, self.locals) 91*cda5da8dSAndroid Build Coastguard Worker except SystemExit: 92*cda5da8dSAndroid Build Coastguard Worker raise 93*cda5da8dSAndroid Build Coastguard Worker except: 94*cda5da8dSAndroid Build Coastguard Worker self.showtraceback() 95*cda5da8dSAndroid Build Coastguard Worker 96*cda5da8dSAndroid Build Coastguard Worker def showsyntaxerror(self, filename=None): 97*cda5da8dSAndroid Build Coastguard Worker """Display the syntax error that just occurred. 98*cda5da8dSAndroid Build Coastguard Worker 99*cda5da8dSAndroid Build Coastguard Worker This doesn't display a stack trace because there isn't one. 100*cda5da8dSAndroid Build Coastguard Worker 101*cda5da8dSAndroid Build Coastguard Worker If a filename is given, it is stuffed in the exception instead 102*cda5da8dSAndroid Build Coastguard Worker of what was there before (because Python's parser always uses 103*cda5da8dSAndroid Build Coastguard Worker "<string>" when reading from a string). 104*cda5da8dSAndroid Build Coastguard Worker 105*cda5da8dSAndroid Build Coastguard Worker The output is written by self.write(), below. 106*cda5da8dSAndroid Build Coastguard Worker 107*cda5da8dSAndroid Build Coastguard Worker """ 108*cda5da8dSAndroid Build Coastguard Worker type, value, tb = sys.exc_info() 109*cda5da8dSAndroid Build Coastguard Worker sys.last_type = type 110*cda5da8dSAndroid Build Coastguard Worker sys.last_value = value 111*cda5da8dSAndroid Build Coastguard Worker sys.last_traceback = tb 112*cda5da8dSAndroid Build Coastguard Worker if filename and type is SyntaxError: 113*cda5da8dSAndroid Build Coastguard Worker # Work hard to stuff the correct filename in the exception 114*cda5da8dSAndroid Build Coastguard Worker try: 115*cda5da8dSAndroid Build Coastguard Worker msg, (dummy_filename, lineno, offset, line) = value.args 116*cda5da8dSAndroid Build Coastguard Worker except ValueError: 117*cda5da8dSAndroid Build Coastguard Worker # Not the format we expect; leave it alone 118*cda5da8dSAndroid Build Coastguard Worker pass 119*cda5da8dSAndroid Build Coastguard Worker else: 120*cda5da8dSAndroid Build Coastguard Worker # Stuff in the right filename 121*cda5da8dSAndroid Build Coastguard Worker value = SyntaxError(msg, (filename, lineno, offset, line)) 122*cda5da8dSAndroid Build Coastguard Worker sys.last_value = value 123*cda5da8dSAndroid Build Coastguard Worker if sys.excepthook is sys.__excepthook__: 124*cda5da8dSAndroid Build Coastguard Worker lines = traceback.format_exception_only(type, value) 125*cda5da8dSAndroid Build Coastguard Worker self.write(''.join(lines)) 126*cda5da8dSAndroid Build Coastguard Worker else: 127*cda5da8dSAndroid Build Coastguard Worker # If someone has set sys.excepthook, we let that take precedence 128*cda5da8dSAndroid Build Coastguard Worker # over self.write 129*cda5da8dSAndroid Build Coastguard Worker sys.excepthook(type, value, tb) 130*cda5da8dSAndroid Build Coastguard Worker 131*cda5da8dSAndroid Build Coastguard Worker def showtraceback(self): 132*cda5da8dSAndroid Build Coastguard Worker """Display the exception that just occurred. 133*cda5da8dSAndroid Build Coastguard Worker 134*cda5da8dSAndroid Build Coastguard Worker We remove the first stack item because it is our own code. 135*cda5da8dSAndroid Build Coastguard Worker 136*cda5da8dSAndroid Build Coastguard Worker The output is written by self.write(), below. 137*cda5da8dSAndroid Build Coastguard Worker 138*cda5da8dSAndroid Build Coastguard Worker """ 139*cda5da8dSAndroid Build Coastguard Worker sys.last_type, sys.last_value, last_tb = ei = sys.exc_info() 140*cda5da8dSAndroid Build Coastguard Worker sys.last_traceback = last_tb 141*cda5da8dSAndroid Build Coastguard Worker try: 142*cda5da8dSAndroid Build Coastguard Worker lines = traceback.format_exception(ei[0], ei[1], last_tb.tb_next) 143*cda5da8dSAndroid Build Coastguard Worker if sys.excepthook is sys.__excepthook__: 144*cda5da8dSAndroid Build Coastguard Worker self.write(''.join(lines)) 145*cda5da8dSAndroid Build Coastguard Worker else: 146*cda5da8dSAndroid Build Coastguard Worker # If someone has set sys.excepthook, we let that take precedence 147*cda5da8dSAndroid Build Coastguard Worker # over self.write 148*cda5da8dSAndroid Build Coastguard Worker sys.excepthook(ei[0], ei[1], last_tb) 149*cda5da8dSAndroid Build Coastguard Worker finally: 150*cda5da8dSAndroid Build Coastguard Worker last_tb = ei = None 151*cda5da8dSAndroid Build Coastguard Worker 152*cda5da8dSAndroid Build Coastguard Worker def write(self, data): 153*cda5da8dSAndroid Build Coastguard Worker """Write a string. 154*cda5da8dSAndroid Build Coastguard Worker 155*cda5da8dSAndroid Build Coastguard Worker The base implementation writes to sys.stderr; a subclass may 156*cda5da8dSAndroid Build Coastguard Worker replace this with a different implementation. 157*cda5da8dSAndroid Build Coastguard Worker 158*cda5da8dSAndroid Build Coastguard Worker """ 159*cda5da8dSAndroid Build Coastguard Worker sys.stderr.write(data) 160*cda5da8dSAndroid Build Coastguard Worker 161*cda5da8dSAndroid Build Coastguard Worker 162*cda5da8dSAndroid Build Coastguard Workerclass InteractiveConsole(InteractiveInterpreter): 163*cda5da8dSAndroid Build Coastguard Worker """Closely emulate the behavior of the interactive Python interpreter. 164*cda5da8dSAndroid Build Coastguard Worker 165*cda5da8dSAndroid Build Coastguard Worker This class builds on InteractiveInterpreter and adds prompting 166*cda5da8dSAndroid Build Coastguard Worker using the familiar sys.ps1 and sys.ps2, and input buffering. 167*cda5da8dSAndroid Build Coastguard Worker 168*cda5da8dSAndroid Build Coastguard Worker """ 169*cda5da8dSAndroid Build Coastguard Worker 170*cda5da8dSAndroid Build Coastguard Worker def __init__(self, locals=None, filename="<console>"): 171*cda5da8dSAndroid Build Coastguard Worker """Constructor. 172*cda5da8dSAndroid Build Coastguard Worker 173*cda5da8dSAndroid Build Coastguard Worker The optional locals argument will be passed to the 174*cda5da8dSAndroid Build Coastguard Worker InteractiveInterpreter base class. 175*cda5da8dSAndroid Build Coastguard Worker 176*cda5da8dSAndroid Build Coastguard Worker The optional filename argument should specify the (file)name 177*cda5da8dSAndroid Build Coastguard Worker of the input stream; it will show up in tracebacks. 178*cda5da8dSAndroid Build Coastguard Worker 179*cda5da8dSAndroid Build Coastguard Worker """ 180*cda5da8dSAndroid Build Coastguard Worker InteractiveInterpreter.__init__(self, locals) 181*cda5da8dSAndroid Build Coastguard Worker self.filename = filename 182*cda5da8dSAndroid Build Coastguard Worker self.resetbuffer() 183*cda5da8dSAndroid Build Coastguard Worker 184*cda5da8dSAndroid Build Coastguard Worker def resetbuffer(self): 185*cda5da8dSAndroid Build Coastguard Worker """Reset the input buffer.""" 186*cda5da8dSAndroid Build Coastguard Worker self.buffer = [] 187*cda5da8dSAndroid Build Coastguard Worker 188*cda5da8dSAndroid Build Coastguard Worker def interact(self, banner=None, exitmsg=None): 189*cda5da8dSAndroid Build Coastguard Worker """Closely emulate the interactive Python console. 190*cda5da8dSAndroid Build Coastguard Worker 191*cda5da8dSAndroid Build Coastguard Worker The optional banner argument specifies the banner to print 192*cda5da8dSAndroid Build Coastguard Worker before the first interaction; by default it prints a banner 193*cda5da8dSAndroid Build Coastguard Worker similar to the one printed by the real Python interpreter, 194*cda5da8dSAndroid Build Coastguard Worker followed by the current class name in parentheses (so as not 195*cda5da8dSAndroid Build Coastguard Worker to confuse this with the real interpreter -- since it's so 196*cda5da8dSAndroid Build Coastguard Worker close!). 197*cda5da8dSAndroid Build Coastguard Worker 198*cda5da8dSAndroid Build Coastguard Worker The optional exitmsg argument specifies the exit message 199*cda5da8dSAndroid Build Coastguard Worker printed when exiting. Pass the empty string to suppress 200*cda5da8dSAndroid Build Coastguard Worker printing an exit message. If exitmsg is not given or None, 201*cda5da8dSAndroid Build Coastguard Worker a default message is printed. 202*cda5da8dSAndroid Build Coastguard Worker 203*cda5da8dSAndroid Build Coastguard Worker """ 204*cda5da8dSAndroid Build Coastguard Worker try: 205*cda5da8dSAndroid Build Coastguard Worker sys.ps1 206*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 207*cda5da8dSAndroid Build Coastguard Worker sys.ps1 = ">>> " 208*cda5da8dSAndroid Build Coastguard Worker try: 209*cda5da8dSAndroid Build Coastguard Worker sys.ps2 210*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 211*cda5da8dSAndroid Build Coastguard Worker sys.ps2 = "... " 212*cda5da8dSAndroid Build Coastguard Worker cprt = 'Type "help", "copyright", "credits" or "license" for more information.' 213*cda5da8dSAndroid Build Coastguard Worker if banner is None: 214*cda5da8dSAndroid Build Coastguard Worker self.write("Python %s on %s\n%s\n(%s)\n" % 215*cda5da8dSAndroid Build Coastguard Worker (sys.version, sys.platform, cprt, 216*cda5da8dSAndroid Build Coastguard Worker self.__class__.__name__)) 217*cda5da8dSAndroid Build Coastguard Worker elif banner: 218*cda5da8dSAndroid Build Coastguard Worker self.write("%s\n" % str(banner)) 219*cda5da8dSAndroid Build Coastguard Worker more = 0 220*cda5da8dSAndroid Build Coastguard Worker while 1: 221*cda5da8dSAndroid Build Coastguard Worker try: 222*cda5da8dSAndroid Build Coastguard Worker if more: 223*cda5da8dSAndroid Build Coastguard Worker prompt = sys.ps2 224*cda5da8dSAndroid Build Coastguard Worker else: 225*cda5da8dSAndroid Build Coastguard Worker prompt = sys.ps1 226*cda5da8dSAndroid Build Coastguard Worker try: 227*cda5da8dSAndroid Build Coastguard Worker line = self.raw_input(prompt) 228*cda5da8dSAndroid Build Coastguard Worker except EOFError: 229*cda5da8dSAndroid Build Coastguard Worker self.write("\n") 230*cda5da8dSAndroid Build Coastguard Worker break 231*cda5da8dSAndroid Build Coastguard Worker else: 232*cda5da8dSAndroid Build Coastguard Worker more = self.push(line) 233*cda5da8dSAndroid Build Coastguard Worker except KeyboardInterrupt: 234*cda5da8dSAndroid Build Coastguard Worker self.write("\nKeyboardInterrupt\n") 235*cda5da8dSAndroid Build Coastguard Worker self.resetbuffer() 236*cda5da8dSAndroid Build Coastguard Worker more = 0 237*cda5da8dSAndroid Build Coastguard Worker if exitmsg is None: 238*cda5da8dSAndroid Build Coastguard Worker self.write('now exiting %s...\n' % self.__class__.__name__) 239*cda5da8dSAndroid Build Coastguard Worker elif exitmsg != '': 240*cda5da8dSAndroid Build Coastguard Worker self.write('%s\n' % exitmsg) 241*cda5da8dSAndroid Build Coastguard Worker 242*cda5da8dSAndroid Build Coastguard Worker def push(self, line): 243*cda5da8dSAndroid Build Coastguard Worker """Push a line to the interpreter. 244*cda5da8dSAndroid Build Coastguard Worker 245*cda5da8dSAndroid Build Coastguard Worker The line should not have a trailing newline; it may have 246*cda5da8dSAndroid Build Coastguard Worker internal newlines. The line is appended to a buffer and the 247*cda5da8dSAndroid Build Coastguard Worker interpreter's runsource() method is called with the 248*cda5da8dSAndroid Build Coastguard Worker concatenated contents of the buffer as source. If this 249*cda5da8dSAndroid Build Coastguard Worker indicates that the command was executed or invalid, the buffer 250*cda5da8dSAndroid Build Coastguard Worker is reset; otherwise, the command is incomplete, and the buffer 251*cda5da8dSAndroid Build Coastguard Worker is left as it was after the line was appended. The return 252*cda5da8dSAndroid Build Coastguard Worker value is 1 if more input is required, 0 if the line was dealt 253*cda5da8dSAndroid Build Coastguard Worker with in some way (this is the same as runsource()). 254*cda5da8dSAndroid Build Coastguard Worker 255*cda5da8dSAndroid Build Coastguard Worker """ 256*cda5da8dSAndroid Build Coastguard Worker self.buffer.append(line) 257*cda5da8dSAndroid Build Coastguard Worker source = "\n".join(self.buffer) 258*cda5da8dSAndroid Build Coastguard Worker more = self.runsource(source, self.filename) 259*cda5da8dSAndroid Build Coastguard Worker if not more: 260*cda5da8dSAndroid Build Coastguard Worker self.resetbuffer() 261*cda5da8dSAndroid Build Coastguard Worker return more 262*cda5da8dSAndroid Build Coastguard Worker 263*cda5da8dSAndroid Build Coastguard Worker def raw_input(self, prompt=""): 264*cda5da8dSAndroid Build Coastguard Worker """Write a prompt and read a line. 265*cda5da8dSAndroid Build Coastguard Worker 266*cda5da8dSAndroid Build Coastguard Worker The returned line does not include the trailing newline. 267*cda5da8dSAndroid Build Coastguard Worker When the user enters the EOF key sequence, EOFError is raised. 268*cda5da8dSAndroid Build Coastguard Worker 269*cda5da8dSAndroid Build Coastguard Worker The base implementation uses the built-in function 270*cda5da8dSAndroid Build Coastguard Worker input(); a subclass may replace this with a different 271*cda5da8dSAndroid Build Coastguard Worker implementation. 272*cda5da8dSAndroid Build Coastguard Worker 273*cda5da8dSAndroid Build Coastguard Worker """ 274*cda5da8dSAndroid Build Coastguard Worker return input(prompt) 275*cda5da8dSAndroid Build Coastguard Worker 276*cda5da8dSAndroid Build Coastguard Worker 277*cda5da8dSAndroid Build Coastguard Worker 278*cda5da8dSAndroid Build Coastguard Workerdef interact(banner=None, readfunc=None, local=None, exitmsg=None): 279*cda5da8dSAndroid Build Coastguard Worker """Closely emulate the interactive Python interpreter. 280*cda5da8dSAndroid Build Coastguard Worker 281*cda5da8dSAndroid Build Coastguard Worker This is a backwards compatible interface to the InteractiveConsole 282*cda5da8dSAndroid Build Coastguard Worker class. When readfunc is not specified, it attempts to import the 283*cda5da8dSAndroid Build Coastguard Worker readline module to enable GNU readline if it is available. 284*cda5da8dSAndroid Build Coastguard Worker 285*cda5da8dSAndroid Build Coastguard Worker Arguments (all optional, all default to None): 286*cda5da8dSAndroid Build Coastguard Worker 287*cda5da8dSAndroid Build Coastguard Worker banner -- passed to InteractiveConsole.interact() 288*cda5da8dSAndroid Build Coastguard Worker readfunc -- if not None, replaces InteractiveConsole.raw_input() 289*cda5da8dSAndroid Build Coastguard Worker local -- passed to InteractiveInterpreter.__init__() 290*cda5da8dSAndroid Build Coastguard Worker exitmsg -- passed to InteractiveConsole.interact() 291*cda5da8dSAndroid Build Coastguard Worker 292*cda5da8dSAndroid Build Coastguard Worker """ 293*cda5da8dSAndroid Build Coastguard Worker console = InteractiveConsole(local) 294*cda5da8dSAndroid Build Coastguard Worker if readfunc is not None: 295*cda5da8dSAndroid Build Coastguard Worker console.raw_input = readfunc 296*cda5da8dSAndroid Build Coastguard Worker else: 297*cda5da8dSAndroid Build Coastguard Worker try: 298*cda5da8dSAndroid Build Coastguard Worker import readline 299*cda5da8dSAndroid Build Coastguard Worker except ImportError: 300*cda5da8dSAndroid Build Coastguard Worker pass 301*cda5da8dSAndroid Build Coastguard Worker console.interact(banner, exitmsg) 302*cda5da8dSAndroid Build Coastguard Worker 303*cda5da8dSAndroid Build Coastguard Worker 304*cda5da8dSAndroid Build Coastguard Workerif __name__ == "__main__": 305*cda5da8dSAndroid Build Coastguard Worker import argparse 306*cda5da8dSAndroid Build Coastguard Worker 307*cda5da8dSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 308*cda5da8dSAndroid Build Coastguard Worker parser.add_argument('-q', action='store_true', 309*cda5da8dSAndroid Build Coastguard Worker help="don't print version and copyright messages") 310*cda5da8dSAndroid Build Coastguard Worker args = parser.parse_args() 311*cda5da8dSAndroid Build Coastguard Worker if args.q or sys.flags.quiet: 312*cda5da8dSAndroid Build Coastguard Worker banner = '' 313*cda5da8dSAndroid Build Coastguard Worker else: 314*cda5da8dSAndroid Build Coastguard Worker banner = None 315*cda5da8dSAndroid Build Coastguard Worker interact(banner) 316