summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib/Remote.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/idlelib/Remote.py')
-rw-r--r--Lib/idlelib/Remote.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/Lib/idlelib/Remote.py b/Lib/idlelib/Remote.py
new file mode 100644
index 0000000..facba78
--- /dev/null
+++ b/Lib/idlelib/Remote.py
@@ -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
+