From 65d7954fe9cd2041683f47f56b77d10366f0fb34 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 25 Aug 2014 13:34:31 +0200 Subject: [PATCH] Runner script for run with command-line. --- python/helpers/pydev/pydev_run_in_console.py | 83 ++++++++++++++++++++ python/helpers/pydev/pydevconsole.py | 4 +- 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 python/helpers/pydev/pydev_run_in_console.py diff --git a/python/helpers/pydev/pydev_run_in_console.py b/python/helpers/pydev/pydev_run_in_console.py new file mode 100644 index 000000000000..1b8e1d230175 --- /dev/null +++ b/python/helpers/pydev/pydev_run_in_console.py @@ -0,0 +1,83 @@ + +from pydevconsole import * + +import pydev_imports + + +def run_file(file, globals=None, locals=None): + if os.path.isdir(file): + new_target = os.path.join(file, '__main__.py') + if os.path.isfile(new_target): + file = new_target + + if globals is None: + # patch provided by: Scott Schlesier - when script is run, it does not + # use globals from pydevd: + # This will prevent the pydevd script from contaminating the namespace for the script to be debugged + + # pretend pydevd is not the main module, and + # convince the file to be debugged that it was loaded as main + sys.modules['pydevd'] = sys.modules['__main__'] + sys.modules['pydevd'].__name__ = 'pydevd' + + from imp import new_module + m = new_module('__main__') + sys.modules['__main__'] = m + if hasattr(sys.modules['pydevd'], '__loader__'): + setattr(m, '__loader__', getattr(sys.modules['pydevd'], '__loader__')) + + m.__file__ = file + globals = m.__dict__ + try: + globals['__builtins__'] = __builtins__ + except NameError: + pass # Not there on Jython... + + if locals is None: + locals = globals + + + print('Running %s'%file) + pydev_imports.execfile(file, globals, locals) # execute the script + + return globals + +#======================================================================================================================= +# main +#======================================================================================================================= +if __name__ == '__main__': + sys.stdin = BaseStdIn() + port, client_port = sys.argv[1:3] + + del sys.argv[1] + del sys.argv[1] + + file = sys.argv[1] + + import pydev_localhost + + if int(port) == 0 and int(client_port) == 0: + (h, p) = pydev_localhost.get_socket_name() + + client_port = p + + host = pydev_localhost.get_localhost() + + + #replace exit (see comments on method) + #note that this does not work in jython!!! (sys method can't be replaced). + sys.exit = DoExit + + interpreter = InterpreterInterface(host, int(client_port), threading.currentThread()) + + server_thread = threading.Thread(target=start_server, + name='ServerThread', + args=(host, int(port), interpreter)) + server_thread.setDaemon(True) + server_thread.start() + + globals = run_file(file, None, None) + + interpreter.getNamespace().update(globals) + + process_exec_queue(interpreter) \ No newline at end of file diff --git a/python/helpers/pydev/pydevconsole.py b/python/helpers/pydev/pydevconsole.py index 565f9db45d1d..e5bf49411416 100644 --- a/python/helpers/pydev/pydevconsole.py +++ b/python/helpers/pydev/pydevconsole.py @@ -248,7 +248,7 @@ except: #======================================================================================================================= # _DoExit #======================================================================================================================= -def _DoExit(*args): +def DoExit(*args): ''' We have to override the exit because calling sys.exit will only actually exit the main thread, and as we're in a Xml-rpc server, that won't work. @@ -321,7 +321,7 @@ def start_server(host, port, interpreter): def StartServer(host, port, client_port): #replace exit (see comments on method) #note that this does not work in jython!!! (sys method can't be replaced). - sys.exit = _DoExit + sys.exit = DoExit interpreter = InterpreterInterface(host, client_port, threading.currentThread())