NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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