Ejemplo n.º 1
0
def RunScript(defName=None, defArgs=None, bShowDialog = 1, debuggingType=None):
	global lastScript, lastArgs, lastDebuggingType
	_debugger_stop_frame_ = 1 # Magic variable so the debugger will hide me!

	# Get the debugger - may be None!
	debugger = GetDebugger()

	if defName is None:
		try:
			pathName = GetActiveFileName()
		except KeyboardInterrupt:
			return # User cancelled save.
	else:
		pathName = defName
	if not pathName:
		pathName = lastScript
	if defArgs is None:
		args = ''
		if pathName==lastScript:
			args = lastArgs
	else:
		args = defArgs
	if debuggingType is None: debuggingType = lastDebuggingType

	if not pathName or bShowDialog:
		dlg = DlgRunScript(debugger is not None)
		dlg['script'] = pathName
		dlg['args'] = args
		dlg['debuggingType'] = debuggingType
		if dlg.DoModal() != win32con.IDOK:
			return
		script=dlg['script']
		args=dlg['args']
		debuggingType = dlg['debuggingType']
		if not script: return
		if debuggingType == RS_DEBUGGER_GO and debugger is not None:
			# This may surprise users - they select "Run under debugger", but
			# it appears not to!  Only warn when they pick from the dialog!
			# First - ensure the debugger is activated to pickup any break-points
			# set in the editor.
			try:
				# Create the debugger, but _dont_ init the debugger GUI.
				rd = debugger._GetCurrentDebugger()
			except AttributeError:
				rd = None
			if rd is not None and len(rd.breaks)==0:
				msg = "There are no active break-points.\r\n\r\nSelecting this debug option without any\r\nbreak-points is unlikely to have the desired effect\r\nas the debugger is unlikely to be invoked..\r\n\r\nWould you like to step-through in the debugger instead?"
				rc = win32ui.MessageBox(msg, win32ui.LoadString(win32ui.IDR_DEBUGGER), win32con.MB_YESNOCANCEL | win32con.MB_ICONINFORMATION)
				if rc == win32con.IDCANCEL:
					return
				if rc == win32con.IDYES:
					debuggingType = RS_DEBUGGER_STEP

		lastDebuggingType = debuggingType
		lastScript = script
		lastArgs = args
	else:
		script = pathName

	# try and open the script.
	if len(os.path.splitext(script)[1])==0:	# check if no extension supplied, and give one.
			script = script + '.py'
	# If no path specified, try and locate the file
	path, fnameonly = os.path.split(script)
	if len(path)==0:
		try:
			os.stat(fnameonly) # See if it is OK as is...
			script = fnameonly
		except os.error:
			fullScript = LocatePythonFile(script)
			if fullScript is None:
				win32ui.MessageBox("The file '%s' can not be located" % script )
				return
			script = fullScript
	else:
		path = win32ui.FullPath(path)
		if not IsOnPythonPath(path): sys.path.append(path)

	# py3k fun: If we use text mode to open the file, we get \r\n
	# translated so Python allows the syntax (good!), but we get back
	# text already decoded from the default encoding (bad!) and Python
	# ignores any encoding decls (bad!).  If we use binary mode we get
	# the raw bytes and Python looks at the encoding (good!) but \r\n
	# chars stay in place so Python throws a syntax error (bad!).
	# So: so the binary thing and manually normalize \r\n.
	try:
		f = open(script, 'rb')
	except IOError as exc:
		win32ui.MessageBox("The file could not be opened - %s (%d)" % (exc.strerror, exc.errno))
		return

	# Get the source-code - as above, normalize \r\n
	code = f.read().replace(byte_crlf, byte_lf).replace(byte_cr, byte_lf) + byte_lf

	# Remember and hack sys.argv for the script.
	oldArgv = sys.argv
	sys.argv = ParseArgs(args)
	sys.argv.insert(0, script)
	# sys.path[0] is the path of the script
	oldPath0 = sys.path[0]
	newPath0 = os.path.split(script)[0]
	if not oldPath0: # if sys.path[0] is empty
		sys.path[0] = newPath0
		insertedPath0 = 0
	else:
		sys.path.insert(0, newPath0)
		insertedPath0 = 1
	bWorked = 0
	win32ui.DoWaitCursor(1)
	base = os.path.split(script)[1]
	# Allow windows to repaint before starting.
	win32ui.PumpWaitingMessages()
	win32ui.SetStatusText('Running script %s...' % base,1 )
	exitCode = 0
	from pywin.framework import interact
	# Check the debugger flags
	if debugger is None and (debuggingType != RS_DEBUGGER_NONE):
		win32ui.MessageBox("No debugger is installed.  Debugging options have been ignored!")
		debuggingType = RS_DEBUGGER_NONE

	# Get a code object - ignore the debugger for this, as it is probably a syntax error
	# at this point
	try:
		codeObject = compile(code, script, "exec")
	except:
		# Almost certainly a syntax error!
		_HandlePythonFailure("run script", script)
		# No code object which to run/debug.
		return
	__main__.__file__=script
	try:
		if debuggingType == RS_DEBUGGER_STEP:
			debugger.run(codeObject, __main__.__dict__, start_stepping=1)
		elif debuggingType == RS_DEBUGGER_GO:
			debugger.run(codeObject, __main__.__dict__, start_stepping=0)
		else:
			# Post mortem or no debugging
			exec(codeObject, __main__.__dict__)
		bWorked = 1
	except bdb.BdbQuit:
		# Dont print tracebacks when the debugger quit, but do print a message.
		print("Debugging session cancelled.")
		exitCode = 1
		bWorked = 1
	except SystemExit as code:
		exitCode = code
		bWorked = 1
	except KeyboardInterrupt:
		# Consider this successful, as we dont want the debugger.
		# (but we do want a traceback!)
		if interact.edit and interact.edit.currentView:
			interact.edit.currentView.EnsureNoPrompt()
		traceback.print_exc()
		if interact.edit and interact.edit.currentView:
			interact.edit.currentView.AppendToPrompt([])
		bWorked = 1
	except:
		if interact.edit and interact.edit.currentView:
			interact.edit.currentView.EnsureNoPrompt()
		traceback.print_exc()
		if interact.edit and interact.edit.currentView:
			interact.edit.currentView.AppendToPrompt([])
		if debuggingType == RS_DEBUGGER_PM:
			debugger.pm()
	del __main__.__file__
	sys.argv = oldArgv
	if insertedPath0:
		del sys.path[0]
	else:
		sys.path[0] = oldPath0
	f.close()
	if bWorked:
		win32ui.SetStatusText("Script '%s' returned exit code %s" %(script, exitCode))
	else:
		win32ui.SetStatusText('Exception raised while running script  %s' % base)
	try:
		sys.stdout.flush()
	except AttributeError:
		pass

	win32ui.DoWaitCursor(0)
Ejemplo n.º 2
0
        win32ui.MessageBox("No debugger is installed.  Debugging options have been ignored!")
        bUnderDebugger = bPostMortemDebugger = 0

    # Get a code object - ignore the debugger for this, as it is probably a syntax error
    # at this point
    try:
        codeObject = compile(f.read()+"\n", script, "exec")
    except:
        _HandlePythonFailure("run script", script)
        # Almost certainly a syntax error!
        traceback.print_exc()
        # No code object which to debug = get out now!
        return
    try:
        if bUnderDebugger:
            debugger.run(codeObject, __main__.__dict__)
        else:
            exec codeObject in __main__.__dict__
        bWorked = 1
    except SystemExit, code:
        exitCode = code
        bWorked = 1
    except KeyboardInterrupt:
        print "Interrupted!"
        # Consider this successful, as we dont want the debugger!?!?
        bWorked = 1
    except SyntaxError:
        # We dont want to break into the debugger for a syntax error!
        traceback.print_exc()
    except:
        # Reset queueing before exception for nice clean printing.
Ejemplo n.º 3
0
	if debugger is None and (debuggingType != RS_DEBUGGER_NONE):
		win32ui.MessageBox("No debugger is installed.  Debugging options have been ignored!")
		debuggingType = RS_DEBUGGER_NONE

	# Get a code object - ignore the debugger for this, as it is probably a syntax error
	# at this point
	try:
		codeObject = compile(f.read()+"\n", script, "exec")
	except:
		# Almost certainly a syntax error!
		_HandlePythonFailure("run script", script)
		# No code object which to run/debug.
		return
	try:
		if debuggingType == RS_DEBUGGER_STEP:
			debugger.run(codeObject, __main__.__dict__, start_stepping=1)
		elif debuggingType == RS_DEBUGGER_GO:
			debugger.run(codeObject, __main__.__dict__, start_stepping=0)
		else:
			# Post mortem or no debugging
			exec codeObject in __main__.__dict__
		bWorked = 1
	except bdb.BdbQuit:
		# Dont print tracebacks when the debugger quit, but do print a message.
		print "Debugging session cancelled."
		exitCode = 1
		bWorked = 1
	except SystemExit, code:
		exitCode = code
		bWorked = 1
	except KeyboardInterrupt:
Ejemplo n.º 4
0
def RunScript(defName=None, defArgs=None, bShowDialog=1, debuggingType=None):
    global lastScript, lastArgs, lastDebuggingType
    _debugger_stop_frame_ = 1  # Magic variable so the debugger will hide me!

    # Get the debugger - may be None!
    debugger = GetDebugger()

    if defName is None:
        try:
            pathName = GetActiveFileName()
        except KeyboardInterrupt:
            return  # User cancelled save.
    else:
        pathName = defName
    if not pathName:
        pathName = lastScript
    if defArgs is None:
        args = ""
        if pathName == lastScript:
            args = lastArgs
    else:
        args = defArgs
    if debuggingType is None:
        debuggingType = lastDebuggingType

    if not pathName or bShowDialog:
        dlg = DlgRunScript(debugger is not None)
        dlg["script"] = pathName
        dlg["args"] = args
        dlg["debuggingType"] = debuggingType
        if dlg.DoModal() != win32con.IDOK:
            return
        script = dlg["script"]
        args = dlg["args"]
        debuggingType = dlg["debuggingType"]
        if not script:
            return
        if debuggingType == RS_DEBUGGER_GO and debugger is not None:
            # This may surprise users - they select "Run under debugger", but
            # it appears not to!  Only warn when they pick from the dialog!
            # First - ensure the debugger is activated to pickup any break-points
            # set in the editor.
            try:
                # Create the debugger, but _dont_ init the debugger GUI.
                rd = debugger._GetCurrentDebugger()
            except AttributeError:
                rd = None
            if rd is not None and len(rd.breaks) == 0:
                msg = "There are no active break-points.\r\n\r\nSelecting this debug option without any\r\nbreak-points is unlikely to have the desired effect\r\nas the debugger is unlikely to be invoked..\r\n\r\nWould you like to step-through in the debugger instead?"
                rc = win32ui.MessageBox(
                    msg,
                    win32ui.LoadString(win32ui.IDR_DEBUGGER),
                    win32con.MB_YESNOCANCEL | win32con.MB_ICONINFORMATION,
                )
                if rc == win32con.IDCANCEL:
                    return
                if rc == win32con.IDYES:
                    debuggingType = RS_DEBUGGER_STEP

        lastDebuggingType = debuggingType
        lastScript = script
        lastArgs = args
    else:
        script = pathName

    # try and open the script.
    if (len(os.path.splitext(script)[1]) == 0
        ):  # check if no extension supplied, and give one.
        script = script + ".py"
    # If no path specified, try and locate the file
    path, fnameonly = os.path.split(script)
    if len(path) == 0:
        try:
            os.stat(fnameonly)  # See if it is OK as is...
            script = fnameonly
        except os.error:
            fullScript = LocatePythonFile(script)
            if fullScript is None:
                win32ui.MessageBox("The file '%s' can not be located" % script)
                return
            script = fullScript
    else:
        path = win32ui.FullPath(path)
        if not IsOnPythonPath(path):
            sys.path.append(path)

    # py3k fun: If we use text mode to open the file, we get \r\n
    # translated so Python allows the syntax (good!), but we get back
    # text already decoded from the default encoding (bad!) and Python
    # ignores any encoding decls (bad!).  If we use binary mode we get
    # the raw bytes and Python looks at the encoding (good!) but \r\n
    # chars stay in place so Python throws a syntax error (bad!).
    # So: so the binary thing and manually normalize \r\n.
    try:
        f = open(script, "rb")
    except IOError as exc:
        win32ui.MessageBox("The file could not be opened - %s (%d)" %
                           (exc.strerror, exc.errno))
        return

    # Get the source-code - as above, normalize \r\n
    code = f.read().replace(byte_crlf, byte_lf).replace(byte_cr,
                                                        byte_lf) + byte_lf

    # Remember and hack sys.argv for the script.
    oldArgv = sys.argv
    sys.argv = ParseArgs(args)
    sys.argv.insert(0, script)
    # sys.path[0] is the path of the script
    oldPath0 = sys.path[0]
    newPath0 = os.path.split(script)[0]
    if not oldPath0:  # if sys.path[0] is empty
        sys.path[0] = newPath0
        insertedPath0 = 0
    else:
        sys.path.insert(0, newPath0)
        insertedPath0 = 1
    bWorked = 0
    win32ui.DoWaitCursor(1)
    base = os.path.split(script)[1]
    # Allow windows to repaint before starting.
    win32ui.PumpWaitingMessages()
    win32ui.SetStatusText("Running script %s..." % base, 1)
    exitCode = 0
    from pywin.framework import interact

    # Check the debugger flags
    if debugger is None and (debuggingType != RS_DEBUGGER_NONE):
        win32ui.MessageBox(
            "No debugger is installed.  Debugging options have been ignored!")
        debuggingType = RS_DEBUGGER_NONE

    # Get a code object - ignore the debugger for this, as it is probably a syntax error
    # at this point
    try:
        codeObject = compile(code, script, "exec")
    except:
        # Almost certainly a syntax error!
        _HandlePythonFailure("run script", script)
        # No code object which to run/debug.
        return
    __main__.__file__ = script
    try:
        if debuggingType == RS_DEBUGGER_STEP:
            debugger.run(codeObject, __main__.__dict__, start_stepping=1)
        elif debuggingType == RS_DEBUGGER_GO:
            debugger.run(codeObject, __main__.__dict__, start_stepping=0)
        else:
            # Post mortem or no debugging
            exec(codeObject, __main__.__dict__)
        bWorked = 1
    except bdb.BdbQuit:
        # Dont print tracebacks when the debugger quit, but do print a message.
        print("Debugging session cancelled.")
        exitCode = 1
        bWorked = 1
    except SystemExit as code:
        exitCode = code
        bWorked = 1
    except KeyboardInterrupt:
        # Consider this successful, as we dont want the debugger.
        # (but we do want a traceback!)
        if interact.edit and interact.edit.currentView:
            interact.edit.currentView.EnsureNoPrompt()
        traceback.print_exc()
        if interact.edit and interact.edit.currentView:
            interact.edit.currentView.AppendToPrompt([])
        bWorked = 1
    except:
        if interact.edit and interact.edit.currentView:
            interact.edit.currentView.EnsureNoPrompt()
        traceback.print_exc()
        if interact.edit and interact.edit.currentView:
            interact.edit.currentView.AppendToPrompt([])
        if debuggingType == RS_DEBUGGER_PM:
            debugger.pm()
    del __main__.__file__
    sys.argv = oldArgv
    if insertedPath0:
        del sys.path[0]
    else:
        sys.path[0] = oldPath0
    f.close()
    if bWorked:
        win32ui.SetStatusText("Script '%s' returned exit code %s" %
                              (script, exitCode))
    else:
        win32ui.SetStatusText("Exception raised while running script  %s" %
                              base)
    try:
        sys.stdout.flush()
    except AttributeError:
        pass

    win32ui.DoWaitCursor(0)