Fix errors and fully support matplotlib interactive mode in run and debug with the...
[idea/community.git] / python / helpers / pydev / pydev_run_in_console.py
1 '''
2 Entry point module to run a file in the interactive console.
3 '''
4 import os
5 import sys
6 from pydevconsole import do_exit, InterpreterInterface, process_exec_queue, start_console_server, init_mpl_in_console
7 from _pydev_imps._pydev_saved_modules import threading
8
9 from _pydev_bundle import pydev_imports
10 from _pydevd_bundle.pydevd_utils import save_main_module
11 from _pydev_bundle.pydev_console_utils import StdIn
12
13
14 def run_file(file, globals=None, locals=None):
15     if os.path.isdir(file):
16         new_target = os.path.join(file, '__main__.py')
17         if os.path.isfile(new_target):
18             file = new_target
19
20     if globals is None:
21         m = save_main_module(file, 'pydev_run_in_console')
22
23         globals = m.__dict__
24         try:
25             globals['__builtins__'] = __builtins__
26         except NameError:
27             pass  # Not there on Jython...
28
29     if locals is None:
30         locals = globals
31
32     sys.path.insert(0, os.path.split(file)[0])
33
34     print('Running %s'%file)
35     pydev_imports.execfile(file, globals, locals)  # execute the script
36
37     return globals
38
39 #=======================================================================================================================
40 # main
41 #=======================================================================================================================
42 if __name__ == '__main__':
43     port, client_port = sys.argv[1:3]
44
45     del sys.argv[1]
46     del sys.argv[1]
47
48     file = sys.argv[1]
49
50     del sys.argv[0]
51
52     from _pydev_bundle import pydev_localhost
53
54     if int(port) == 0 and int(client_port) == 0:
55         (h, p) = pydev_localhost.get_socket_name()
56
57         client_port = p
58
59     host = pydev_localhost.get_localhost()
60
61
62     #replace exit (see comments on method)
63     #note that this does not work in jython!!! (sys method can't be replaced).
64     sys.exit = do_exit
65
66     interpreter = InterpreterInterface(host, int(client_port), threading.currentThread())
67
68     server_thread = threading.Thread(target=start_console_server,
69                                      name='ServerThread',
70                                      args=(host, int(port), interpreter))
71     server_thread.setDaemon(True)
72     server_thread.start()
73
74     sys.stdin = StdIn(interpreter, host, client_port, sys.stdin)
75
76     init_mpl_in_console(interpreter)
77
78     globals = run_file(file, None, None)
79
80     interpreter.get_namespace().update(globals)
81
82     process_exec_queue(interpreter)