mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00
Initial revision
This commit is contained in:
parent
33a6da9971
commit
7aced17437
73 changed files with 12383 additions and 0 deletions
101
Lib/idlelib/Remote.py
Normal file
101
Lib/idlelib/Remote.py
Normal file
|
@ -0,0 +1,101 @@
|
|||
"""Remote
|
||||
This module is imported by the loader and serves to control
|
||||
the execution of the user program. It presently executes files
|
||||
and reports exceptions to IDLE. It could be extended to provide
|
||||
other services, such as interactive mode and debugging. To that
|
||||
end, it could be a subclass of e.g. InteractiveInterpreter.
|
||||
|
||||
Two other classes, pseudoIn and pseudoOut, are file emulators also
|
||||
used by loader.
|
||||
"""
|
||||
import sys, os
|
||||
import traceback
|
||||
|
||||
class Remote:
|
||||
def __init__(self, main, master):
|
||||
self.main = main
|
||||
self.master = master
|
||||
self.this_file = self.canonic( self.__init__.im_func.func_code.co_filename )
|
||||
|
||||
def canonic(self, path):
|
||||
return os.path.normcase(os.path.abspath(path))
|
||||
|
||||
def mainloop(self):
|
||||
while 1:
|
||||
args = self.master.get_command()
|
||||
|
||||
try:
|
||||
f = getattr(self,args[0])
|
||||
apply(f,args[1:])
|
||||
except:
|
||||
if not self.report_exception(): raise
|
||||
|
||||
def finish(self):
|
||||
sys.exit()
|
||||
|
||||
def run(self, *argv):
|
||||
sys.argv = argv
|
||||
|
||||
path = self.canonic( argv[0] )
|
||||
dir = self.dir = os.path.dirname(path)
|
||||
os.chdir(dir)
|
||||
|
||||
sys.path[0] = dir
|
||||
|
||||
usercode = open(path)
|
||||
exec usercode in self.main
|
||||
|
||||
def report_exception(self):
|
||||
try:
|
||||
type, value, tb = sys.exc_info()
|
||||
sys.last_type = type
|
||||
sys.last_value = value
|
||||
sys.last_traceback = tb
|
||||
|
||||
tblist = traceback.extract_tb(tb)
|
||||
|
||||
# Look through the traceback, canonicalizing filenames and
|
||||
# eliminating leading and trailing system modules.
|
||||
first = last = 1
|
||||
for i in range(len(tblist)):
|
||||
filename, lineno, name, line = tblist[i]
|
||||
filename = self.canonic(filename)
|
||||
tblist[i] = filename, lineno, name, line
|
||||
|
||||
dir = os.path.dirname(filename)
|
||||
if filename == self.this_file:
|
||||
first = i+1
|
||||
elif dir==self.dir:
|
||||
last = i+1
|
||||
|
||||
# Canonicalize the filename in a syntax error, too:
|
||||
if type is SyntaxError:
|
||||
try:
|
||||
msg, (filename, lineno, offset, line) = value
|
||||
filename = self.canonic(filename)
|
||||
value = msg, (filename, lineno, offset, line)
|
||||
except:
|
||||
pass
|
||||
|
||||
return self.master.program_exception( type, value, tblist, first, last )
|
||||
finally:
|
||||
# avoid any circular reference through the traceback
|
||||
del tb
|
||||
|
||||
class pseudoIn:
|
||||
def __init__(self, readline):
|
||||
self.readline = readline
|
||||
def isatty():
|
||||
return 1
|
||||
|
||||
class pseudoOut:
|
||||
def __init__(self, func, **kw):
|
||||
self.func = func
|
||||
self.kw = kw
|
||||
def write(self, *args):
|
||||
return apply( self.func, args, self.kw )
|
||||
def writelines(self, l):
|
||||
map(self.write, l)
|
||||
def flush(self):
|
||||
pass
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue