code.py (4995B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\code.py 2 import logging 3 import sys 4 import traceback 5 from codeop import CommandCompiler, compile_command 6 __all__ = ['InteractiveInterpreter', 7 'InteractiveConsole', 8 'interact', 9 'compile_command'] 10 11 def softspace(file, newvalue): 12 oldvalue = 0 13 try: 14 oldvalue = file.softspace 15 except AttributeError: 16 pass 17 18 try: 19 file.softspace = newvalue 20 except (AttributeError, TypeError): 21 pass 22 23 return oldvalue 24 25 26 class InteractiveInterpreter: 27 28 def __init__(self, locals = None): 29 if locals is None: 30 locals = {'__name__': '__console__', 31 '__doc__': None} 32 self.locals = locals 33 self.compile = CommandCompiler() 34 self._logger = logging.getLogger('InteractiveInterpreter') 35 36 def runsource(self, source, filename = '<input>', symbol = 'single'): 37 try: 38 code = self.compile(source, filename, symbol) 39 except (OverflowError, SyntaxError, ValueError): 40 self.showsyntaxerror(filename) 41 return False 42 43 if code is None: 44 return True 45 self.runcode(code) 46 return False 47 48 def runcode(self, code): 49 try: 50 exec code in self.locals 51 except SystemExit: 52 raise 53 except: 54 self.showtraceback() 55 else: 56 if softspace(sys.stdout, 0): 57 print 58 59 def showsyntaxerror(self, filename = None): 60 type, value, sys.last_traceback = sys.exc_info() 61 sys.last_type = type 62 sys.last_value = value 63 if filename and type is SyntaxError: 64 try: 65 msg, (dummy_filename, lineno, offset, line) = value 66 except: 67 pass 68 else: 69 value = SyntaxError(msg, (filename, 70 lineno, 71 offset, 72 line)) 73 sys.last_value = value 74 75 list = traceback.format_exception_only(type, value) 76 map(self.write, list) 77 78 def showtraceback(self): 79 try: 80 type, value, tb = sys.exc_info() 81 sys.last_type = type 82 sys.last_value = value 83 sys.last_traceback = tb 84 tblist = traceback.extract_tb(tb) 85 del tblist[:1] 86 list = traceback.format_list(tblist) 87 if list: 88 list.insert(0, 'Traceback (most recent call last):\n') 89 list[len(list):] = traceback.format_exception_only(type, value) 90 finally: 91 tblist = tb = None 92 93 self._logger.error(''.join(list)) 94 map(self.write, list) 95 96 def write(self, data): 97 sys.stderr.write(data) 98 99 100 class InteractiveConsole(InteractiveInterpreter): 101 102 def __init__(self, locals = None, filename = '<console>'): 103 InteractiveInterpreter.__init__(self, locals) 104 self.filename = filename 105 self.resetbuffer() 106 107 def resetbuffer(self): 108 self.buffer = [] 109 110 def interact(self, banner = None): 111 try: 112 sys.ps1 113 except AttributeError: 114 sys.ps1 = '>>> ' 115 116 try: 117 sys.ps2 118 except AttributeError: 119 sys.ps2 = '... ' 120 121 cprt = 'Type "help", "copyright", "credits" or "license" for more information.' 122 if banner is None: 123 self.write('Python %s on %s\n%s\n(%s)\n' % (sys.version, 124 sys.platform, 125 cprt, 126 self.__class__.__name__)) 127 else: 128 self.write('%s\n' % str(banner)) 129 more = 0 130 while 1: 131 try: 132 if more: 133 prompt = sys.ps2 134 else: 135 prompt = sys.ps1 136 try: 137 line = self.raw_input(prompt) 138 encoding = getattr(sys.stdin, 'encoding', None) 139 if encoding and not isinstance(line, unicode): 140 line = line.decode(encoding) 141 except EOFError: 142 self.write('\n') 143 break 144 else: 145 more = self.push(line) 146 147 except KeyboardInterrupt: 148 self.write('\nKeyboardInterrupt\n') 149 self.resetbuffer() 150 more = 0 151 152 def push(self, line, symbol = 'single'): 153 self.buffer.append(line) 154 source = '\n'.join(self.buffer) 155 more = self.runsource(source, self.filename, symbol) 156 if not more: 157 self.resetbuffer() 158 return more 159 160 def raw_input(self, prompt = ''): 161 return raw_input(prompt) 162 163 164 def interact(banner = None, readfunc = None, local = None): 165 console = InteractiveConsole(local) 166 if readfunc is not None: 167 console.raw_input = readfunc 168 else: 169 try: 170 import readline 171 except ImportError: 172 pass 173 174 console.interact(banner) 175 176 177 if __name__ == '__main__': 178 interact()