def OnApply(self, event): """Event handler for Apply button""" # See if we have valid python try: ast.parse(self.macros) except: # Grab the traceback and print it for the user s = StringIO() e = exc_info() # usr_tb will more than likely be none because ast throws # SytnaxErrorsas occurring outside of the current # execution frame usr_tb = get_user_codeframe(e[2]) or None print_exception(e[0], e[1], usr_tb, None, s) post_command_event(self.parent, self.MacroErrorMsg, err=s.getvalue()) success = False else: self.result_ctrl.SetValue('') post_command_event(self.parent, self.MacroReplaceMsg, macros=self.macros) post_command_event(self.parent, self.MacroExecuteMsg) success = True event.Skip() return success
def _is_invalid_code(self): """Preliminary code check Returns a string with the error message if code is not valid Python. If the code runs without errors, an empty string is retruned. """ try: ast.parse(self.code_array.macros) except Exception as ex: # Grab the traceback and return it stringio = StringIO() excinfo = exc_info() # usr_tb will more than likely be none because ast throws # SytnaxErrors as occurring outside of the current execution frame usr_tb = get_user_codeframe(excinfo[2]) or None print_exception(excinfo[0], excinfo[1], usr_tb, None, stringio) return stringio.getvalue() else: return ''
def execute_macros(self): """Executes all macros and returns result string Executes macros only when not in safe_mode """ if self.safe_mode: return '', "Safe mode activated. Code not executed." # Windows exec does not like Windows newline self.macros = self.macros.replace('\r\n', '\n') # Set up environment for evaluation globals().update(self._get_updated_environment()) # Create file-like string to capture output code_out = cStringIO.StringIO() code_err = cStringIO.StringIO() err_msg = cStringIO.StringIO() # Capture output and errors sys.stdout = code_out sys.stderr = code_err try: import signal signal.signal(signal.SIGALRM, self.handler) signal.alarm(config["timeout"]) except: # No POSIX system pass try: exec(self.macros, globals()) try: signal.alarm(0) except: # No POSIX system pass except Exception: # Print exception # (Because of how the globals are handled during execution # we must import modules here) from traceback import print_exception from src.lib.exception_handling import get_user_codeframe exc_info = sys.exc_info() user_tb = get_user_codeframe(exc_info[2]) or exc_info[2] print_exception(exc_info[0], exc_info[1], user_tb, None, err_msg) # Restore stdout and stderr sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ results = code_out.getvalue() errs = code_err.getvalue() + err_msg.getvalue() code_out.close() code_err.close() # Reset result cache self.result_cache.clear() # Reset frozen cache self.frozen_cache.clear() return results, errs