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 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: exec(self.macros, globals()) except Exception, err: # 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_handeling 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)