Mercurial > cpython-lru_cache-weakref
annotate Lib/idlelib/run.py @ 79675:c0a2294de787 2.7
Issue #16199: Backport 2to3 typo fix from 3.2.
| author | Chris Jerdonek <chris.jerdonek@gmail.com> |
|---|---|
| date | Thu, 11 Oct 2012 16:15:46 -0700 |
| parents | fa7d4ecc6357 |
| children | def4cd7e0a9f |
| rev | line source |
|---|---|
| 23547 | 1 import sys |
|
78036
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
2 import io |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
3 import linecache |
|
24386
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
4 import time |
|
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
5 import socket |
| 28096 | 6 import traceback |
|
29445
e5d03360571d
Interrupt module has been folded into the thread module
Kurt B. Kaiser <kbk@shore.net>
parents:
29365
diff
changeset
|
7 import thread |
| 28385 | 8 import threading |
| 9 import Queue | |
|
25691
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
10 |
|
63585
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
11 from idlelib import CallTips |
|
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
12 from idlelib import AutoComplete |
|
35891
8fd46b660e66
Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
34945
diff
changeset
|
13 |
|
63585
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
14 from idlelib import RemoteDebugger |
|
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
15 from idlelib import RemoteObjectBrowser |
|
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
16 from idlelib import StackViewer |
|
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
17 from idlelib import rpc |
| 23547 | 18 |
|
25691
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
19 import __main__ |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
20 |
|
29365
72ce7cc03f27
Avoid problem resolving 'localhost'
Kurt B. Kaiser <kbk@shore.net>
parents:
29353
diff
changeset
|
21 LOCALHOST = '127.0.0.1' |
|
72ce7cc03f27
Avoid problem resolving 'localhost'
Kurt B. Kaiser <kbk@shore.net>
parents:
29353
diff
changeset
|
22 |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
23 try: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
24 import warnings |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
25 except ImportError: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
26 pass |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
27 else: |
|
49520
d7a728420b03
Merged revisions 66922 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47248
diff
changeset
|
28 def idle_formatwarning_subproc(message, category, filename, lineno, |
|
55639
c6d32766e94c
Issue #3926: Fix the usage of the new showwarnings and formatwarning.
Guilherme Polo <ggpolo@gmail.com>
parents:
52710
diff
changeset
|
29 line=None): |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
30 """Format warnings the IDLE way""" |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
31 s = "\nWarning (from warnings module):\n" |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
32 s += ' File \"%s\", line %s\n' % (filename, lineno) |
|
55639
c6d32766e94c
Issue #3926: Fix the usage of the new showwarnings and formatwarning.
Guilherme Polo <ggpolo@gmail.com>
parents:
52710
diff
changeset
|
33 if line is None: |
|
c6d32766e94c
Issue #3926: Fix the usage of the new showwarnings and formatwarning.
Guilherme Polo <ggpolo@gmail.com>
parents:
52710
diff
changeset
|
34 line = linecache.getline(filename, lineno) |
|
c6d32766e94c
Issue #3926: Fix the usage of the new showwarnings and formatwarning.
Guilherme Polo <ggpolo@gmail.com>
parents:
52710
diff
changeset
|
35 line = line.strip() |
|
32484
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
36 if line: |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
37 s += " %s\n" % line |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
38 s += "%s: %s\n" % (category.__name__, message) |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
39 return s |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
40 warnings.formatwarning = idle_formatwarning_subproc |
|
f3cb95cd413f
Redirect the warning stream to the shell during the ScriptBinding check of user code
Kurt B. Kaiser <kbk@shore.net>
parents:
31412
diff
changeset
|
41 |
| 28385 | 42 # Thread shared globals: Establish a queue between a subthread (which handles |
| 43 # the socket) and the main thread (which runs user code), plus global | |
|
43512
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
44 # completion, exit and interruptable (the main thread) flags: |
| 28385 | 45 |
| 29254 | 46 exit_now = False |
| 47 quitting = False | |
|
43512
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
48 interruptable = False |
| 28385 | 49 |
|
29281
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
50 def main(del_exitfunc=False): |
|
24386
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
51 """Start the Python execution server in a subprocess |
|
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
52 |
|
25691
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
53 In the Python subprocess, RPCServer is instantiated with handlerclass |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
54 MyHandler, which inherits register/unregister methods from RPCHandler via |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
55 the mix-in class SocketIO. |
|
24386
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
56 |
| 28385 | 57 When the RPCServer 'server' is instantiated, the TCPServer initialization |
|
25691
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
58 creates an instance of run.MyHandler and calls its handle() method. |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
59 handle() instantiates a run.Executive object, passing it a reference to the |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
60 MyHandler object. That reference is saved as attribute rpchandler of the |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
61 Executive instance. The Executive methods have access to the reference and |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
62 can pass it on to entities that they command |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
63 (e.g. RemoteDebugger.Debugger.start_debugger()). The latter, in turn, can |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
64 call MyHandler(SocketIO) register/unregister methods via the reference to |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
65 register and unregister themselves. |
|
24386
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
66 |
|
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
67 """ |
| 29254 | 68 global exit_now |
| 69 global quitting | |
|
29281
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
70 global no_exitfunc |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
71 no_exitfunc = del_exitfunc |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
72 #time.sleep(15) # test subprocess not responding |
|
52710
b984456196af
Remove port spec from run.py and fix bug where
Kurt B. Kaiser <kbk@shore.net>
parents:
49519
diff
changeset
|
73 try: |
|
b984456196af
Remove port spec from run.py and fix bug where
Kurt B. Kaiser <kbk@shore.net>
parents:
49519
diff
changeset
|
74 assert(len(sys.argv) > 1) |
|
b984456196af
Remove port spec from run.py and fix bug where
Kurt B. Kaiser <kbk@shore.net>
parents:
49519
diff
changeset
|
75 port = int(sys.argv[-1]) |
|
b984456196af
Remove port spec from run.py and fix bug where
Kurt B. Kaiser <kbk@shore.net>
parents:
49519
diff
changeset
|
76 except: |
|
b984456196af
Remove port spec from run.py and fix bug where
Kurt B. Kaiser <kbk@shore.net>
parents:
49519
diff
changeset
|
77 print>>sys.stderr, "IDLE Subprocess: no IP port passed in sys.argv." |
|
b984456196af
Remove port spec from run.py and fix bug where
Kurt B. Kaiser <kbk@shore.net>
parents:
49519
diff
changeset
|
78 return |
| 23547 | 79 sys.argv[:] = [""] |
| 28385 | 80 sockthread = threading.Thread(target=manage_socket, |
| 81 name='SockThread', | |
|
29365
72ce7cc03f27
Avoid problem resolving 'localhost'
Kurt B. Kaiser <kbk@shore.net>
parents:
29353
diff
changeset
|
82 args=((LOCALHOST, port),)) |
| 28385 | 83 sockthread.setDaemon(True) |
| 84 sockthread.start() | |
| 85 while 1: | |
| 86 try: | |
| 29254 | 87 if exit_now: |
| 88 try: | |
|
29281
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
89 exit() |
| 29254 | 90 except KeyboardInterrupt: |
| 91 # exiting but got an extra KBI? Try again! | |
| 92 continue | |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
93 try: |
|
34945
9fe7801fc9a4
Use Queue's blocking feature instead of sleeping in the main
Kurt B. Kaiser <kbk@shore.net>
parents:
34212
diff
changeset
|
94 seq, request = rpc.request_queue.get(block=True, timeout=0.05) |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
95 except Queue.Empty: |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
96 continue |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
97 method, args, kwargs = request |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
98 ret = method(*args, **kwargs) |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
99 rpc.response_queue.put((seq, ret)) |
|
29115
4f87a84e9beb
On Windows the subprocess was not exiting during a restart.
Kurt B. Kaiser <kbk@shore.net>
parents:
29076
diff
changeset
|
100 except KeyboardInterrupt: |
| 29254 | 101 if quitting: |
| 102 exit_now = True | |
|
29115
4f87a84e9beb
On Windows the subprocess was not exiting during a restart.
Kurt B. Kaiser <kbk@shore.net>
parents:
29076
diff
changeset
|
103 continue |
| 29156 | 104 except SystemExit: |
| 105 raise | |
|
29076
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
106 except: |
| 29254 | 107 type, value, tb = sys.exc_info() |
| 29156 | 108 try: |
| 109 print_exception() | |
| 110 rpc.response_queue.put((seq, None)) | |
| 111 except: | |
| 29254 | 112 # Link didn't work, print same exception to __stderr__ |
| 113 traceback.print_exception(type, value, tb, file=sys.__stderr__) | |
|
29281
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
114 exit() |
| 29254 | 115 else: |
| 116 continue | |
| 28385 | 117 |
| 118 def manage_socket(address): | |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
119 for i in range(3): |
|
24386
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
120 time.sleep(i) |
|
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
121 try: |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
122 server = MyRPCServer(address, MyHandler) |
|
24386
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
123 break |
|
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
124 except socket.error, err: |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
125 print>>sys.__stderr__,"IDLE Subprocess: socket error: "\ |
|
63585
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
126 + err.args[1] + ", retrying...." |
|
24386
0e27b67247da
Reverse the RPC socket connection: Python execution server connects to
Kurt B. Kaiser <kbk@shore.net>
parents:
23995
diff
changeset
|
127 else: |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
128 print>>sys.__stderr__, "IDLE Subprocess: Connection to "\ |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
129 "IDLE GUI failed, exiting." |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
130 show_socket_error(err, address) |
| 29254 | 131 global exit_now |
| 132 exit_now = True | |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
133 return |
| 28385 | 134 server.handle_request() # A single request only |
| 135 | |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
136 def show_socket_error(err, address): |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
137 import Tkinter |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
138 import tkMessageBox |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
139 root = Tkinter.Tk() |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
140 root.withdraw() |
|
63585
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
141 if err.args[0] == 61: # connection refused |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
142 msg = "IDLE's subprocess can't connect to %s:%d. This may be due "\ |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
143 "to your personal firewall configuration. It is safe to "\ |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
144 "allow this internal connection because no data is visible on "\ |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
145 "external ports." % address |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
146 tkMessageBox.showerror("IDLE Subprocess Error", msg, parent=root) |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
147 else: |
|
63585
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
148 tkMessageBox.showerror("IDLE Subprocess Error", |
|
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
149 "Socket Error: %s" % err.args[1]) |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
150 root.destroy() |
|
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
151 |
|
29076
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
152 def print_exception(): |
|
31311
5eb9e25e63fd
- Print correct exception even if source file changed since shell was
Kurt B. Kaiser <kbk@shore.net>
parents:
31007
diff
changeset
|
153 import linecache |
|
5eb9e25e63fd
- Print correct exception even if source file changed since shell was
Kurt B. Kaiser <kbk@shore.net>
parents:
31007
diff
changeset
|
154 linecache.checkcache() |
|
29076
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
155 flush_stdout() |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
156 efile = sys.stderr |
| 31007 | 157 typ, val, tb = excinfo = sys.exc_info() |
| 158 sys.last_type, sys.last_value, sys.last_traceback = excinfo | |
|
29076
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
159 tbe = traceback.extract_tb(tb) |
|
31412
266f226f471d
Added a Tk error dialog to run.py inform the user if the subprocess can't
Kurt B. Kaiser <kbk@shore.net>
parents:
31311
diff
changeset
|
160 print>>efile, '\nTraceback (most recent call last):' |
|
29076
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
161 exclude = ("run.py", "rpc.py", "threading.py", "Queue.py", |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
162 "RemoteDebugger.py", "bdb.py") |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
163 cleanup_traceback(tbe, exclude) |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
164 traceback.print_list(tbe, file=efile) |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
165 lines = traceback.format_exception_only(typ, val) |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
166 for line in lines: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
167 print>>efile, line, |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
168 |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
169 def cleanup_traceback(tb, exclude): |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
170 "Remove excluded traces from beginning/end of tb; get cached lines" |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
171 orig_tb = tb[:] |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
172 while tb: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
173 for rpcfile in exclude: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
174 if tb[0][0].count(rpcfile): |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
175 break # found an exclude, break for: and delete tb[0] |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
176 else: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
177 break # no excludes, have left RPC code, break while: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
178 del tb[0] |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
179 while tb: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
180 for rpcfile in exclude: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
181 if tb[-1][0].count(rpcfile): |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
182 break |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
183 else: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
184 break |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
185 del tb[-1] |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
186 if len(tb) == 0: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
187 # exception was in IDLE internals, don't prune! |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
188 tb[:] = orig_tb[:] |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
189 print>>sys.stderr, "** IDLE Internal Exception: " |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
190 rpchandler = rpc.objecttable['exec'].rpchandler |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
191 for i in range(len(tb)): |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
192 fn, ln, nm, line = tb[i] |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
193 if nm == '?': |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
194 nm = "-toplevel-" |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
195 if not line and fn.startswith("<pyshell#"): |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
196 line = rpchandler.remotecall('linecache', 'getline', |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
197 (fn, ln), {}) |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
198 tb[i] = fn, ln, nm, line |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
199 |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
200 def flush_stdout(): |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
201 try: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
202 if sys.stdout.softspace: |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
203 sys.stdout.softspace = 0 |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
204 sys.stdout.write("\n") |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
205 except (AttributeError, EOFError): |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
206 pass |
|
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
207 |
|
29281
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
208 def exit(): |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
209 """Exit subprocess, possibly after first deleting sys.exitfunc |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
210 |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
211 If config-main.cfg/.def 'General' 'delete-exitfunc' is True, then any |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
212 sys.exitfunc will be removed before exiting. (VPython support) |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
213 |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
214 """ |
|
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
215 if no_exitfunc: |
|
45329
1e0ee324c513
There was an error on exit if no sys.exitfunc was defined. Issue 1647.
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
216 try: |
|
1e0ee324c513
There was an error on exit if no sys.exitfunc was defined. Issue 1647.
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
217 del sys.exitfunc |
|
1e0ee324c513
There was an error on exit if no sys.exitfunc was defined. Issue 1647.
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
218 except AttributeError: |
|
1e0ee324c513
There was an error on exit if no sys.exitfunc was defined. Issue 1647.
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
219 pass |
|
29281
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
220 sys.exit(0) |
| 23547 | 221 |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
222 class MyRPCServer(rpc.RPCServer): |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
223 |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
224 def handle_error(self, request, client_address): |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
225 """Override RPCServer method for IDLE |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
226 |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
227 Interrupt the MainThread and exit server if link is dropped. |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
228 |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
229 """ |
|
34012
96f62c6798e8
On OpenBSD, terminating IDLE with ctrl-c from the command line caused a
Kurt B. Kaiser <kbk@shore.net>
parents:
32484
diff
changeset
|
230 global quitting |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
231 try: |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
232 raise |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
233 except SystemExit: |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
234 raise |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
235 except EOFError: |
| 29254 | 236 global exit_now |
| 237 exit_now = True | |
|
29445
e5d03360571d
Interrupt module has been folded into the thread module
Kurt B. Kaiser <kbk@shore.net>
parents:
29365
diff
changeset
|
238 thread.interrupt_main() |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
239 except: |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
240 erf = sys.__stderr__ |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
241 print>>erf, '\n' + '-'*40 |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
242 print>>erf, 'Unhandled server exception!' |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
243 print>>erf, 'Thread: %s' % threading.currentThread().getName() |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
244 print>>erf, 'Client Address: ', client_address |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
245 print>>erf, 'Request: ', repr(request) |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
246 traceback.print_exc(file=erf) |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
247 print>>erf, '\n*** Unrecoverable, server exiting!' |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
248 print>>erf, '-'*40 |
|
34012
96f62c6798e8
On OpenBSD, terminating IDLE with ctrl-c from the command line caused a
Kurt B. Kaiser <kbk@shore.net>
parents:
32484
diff
changeset
|
249 quitting = True |
|
96f62c6798e8
On OpenBSD, terminating IDLE with ctrl-c from the command line caused a
Kurt B. Kaiser <kbk@shore.net>
parents:
32484
diff
changeset
|
250 thread.interrupt_main() |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
251 |
|
78036
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
252 class _RPCFile(io.TextIOBase): |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
253 """Wrapper class for the RPC proxy to typecheck arguments |
|
78058
b659315883dd
Don't use TextIOBase implementations in _RPCFile.
Martin v. Löwis <martin@v.loewis.de>
parents:
78055
diff
changeset
|
254 that may not support pickling. The base class is there only |
|
b659315883dd
Don't use TextIOBase implementations in _RPCFile.
Martin v. Löwis <martin@v.loewis.de>
parents:
78055
diff
changeset
|
255 to support type tests; all implementations come from the remote |
|
b659315883dd
Don't use TextIOBase implementations in _RPCFile.
Martin v. Löwis <martin@v.loewis.de>
parents:
78055
diff
changeset
|
256 object.""" |
|
78036
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
257 |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
258 def __init__(self, rpc): |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
259 super.__setattr__(self, 'rpc', rpc) |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
260 |
|
78058
b659315883dd
Don't use TextIOBase implementations in _RPCFile.
Martin v. Löwis <martin@v.loewis.de>
parents:
78055
diff
changeset
|
261 def __getattribute__(self, name): |
|
78061
93df82c18781
Use _RPCFile.write properly.
Martin v. Löwis <martin@v.loewis.de>
parents:
78058
diff
changeset
|
262 # When accessing the 'rpc' attribute, or 'write', use ours |
|
78275
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
263 if name in ('rpc', 'write', 'writelines'): |
|
78058
b659315883dd
Don't use TextIOBase implementations in _RPCFile.
Martin v. Löwis <martin@v.loewis.de>
parents:
78055
diff
changeset
|
264 return io.TextIOBase.__getattribute__(self, name) |
|
b659315883dd
Don't use TextIOBase implementations in _RPCFile.
Martin v. Löwis <martin@v.loewis.de>
parents:
78055
diff
changeset
|
265 # Else only look into the remote object only |
|
78036
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
266 return getattr(self.rpc, name) |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
267 |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
268 def __setattr__(self, name, value): |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
269 return setattr(self.rpc, name, value) |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
270 |
|
78275
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
271 @staticmethod |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
272 def _ensure_string(func): |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
273 def f(self, s): |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
274 if not isinstance(s, basestring): |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
275 raise TypeError('must be str, not ' + type(s).__name__) |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
276 return func(self, s) |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
277 return f |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
278 |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
279 class _RPCOutputFile(_RPCFile): |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
280 @_RPCFile._ensure_string |
|
78036
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
281 def write(self, s): |
|
58189e37331c
- Issue #13532: Check that arguments to sys.stdout.write are strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
68256
diff
changeset
|
282 return self.rpc.write(s) |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
283 |
|
78275
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
284 class _RPCInputFile(_RPCFile): |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
285 @_RPCFile._ensure_string |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
286 def write(self, s): |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
287 raise io.UnsupportedOperation("not writable") |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
288 writelines = write |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
289 |
| 23547 | 290 class MyHandler(rpc.RPCHandler): |
| 291 | |
| 292 def handle(self): | |
| 28385 | 293 """Override base method""" |
| 23547 | 294 executive = Executive(self) |
| 295 self.register("exec", executive) | |
|
78275
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
296 self.console = self.get_remote_proxy("stdin") |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
297 sys.stdin = _RPCInputFile(self.console) |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
298 sys.stdout = _RPCOutputFile(self.get_remote_proxy("stdout")) |
|
fa7d4ecc6357
Issue #15318: Prevent writing to sys.stdin.
Martin v. Löwis <martin@v.loewis.de>
parents:
78061
diff
changeset
|
299 sys.stderr = _RPCOutputFile(self.get_remote_proxy("stderr")) |
|
63585
df378e44ba9a
Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
49520
diff
changeset
|
300 from idlelib import IOBinding |
|
29582
ee14e5b06ed1
Idlefork patch #682347: convert Unicode strings from readline to
Martin v. Löwis <martin@v.loewis.de>
parents:
29452
diff
changeset
|
301 sys.stdin.encoding = sys.stdout.encoding = \ |
|
ee14e5b06ed1
Idlefork patch #682347: convert Unicode strings from readline to
Martin v. Löwis <martin@v.loewis.de>
parents:
29452
diff
changeset
|
302 sys.stderr.encoding = IOBinding.encoding |
|
29353
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
303 self.interp = self.get_remote_proxy("interp") |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
304 rpc.RPCHandler.getresponse(self, myseq=None, wait=0.05) |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
305 |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
306 def exithook(self): |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
307 "override SocketIO method - wait for MainThread to shut us down" |
| 29254 | 308 time.sleep(10) |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
309 |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
310 def EOFhook(self): |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
311 "Override SocketIO method - terminate wait on callback and exit thread" |
| 29254 | 312 global quitting |
| 313 quitting = True | |
|
29445
e5d03360571d
Interrupt module has been folded into the thread module
Kurt B. Kaiser <kbk@shore.net>
parents:
29365
diff
changeset
|
314 thread.interrupt_main() |
|
29034
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
315 |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
316 def decode_interrupthook(self): |
|
656493534cc7
1. Implement processing of user code in subprocess MainThread. Pass loop
Kurt B. Kaiser <kbk@shore.net>
parents:
28385
diff
changeset
|
317 "interrupt awakened thread" |
| 29254 | 318 global quitting |
| 319 quitting = True | |
|
29445
e5d03360571d
Interrupt module has been folded into the thread module
Kurt B. Kaiser <kbk@shore.net>
parents:
29365
diff
changeset
|
320 thread.interrupt_main() |
| 28385 | 321 |
| 23547 | 322 |
|
34212
1e8b033f91dc
The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents:
34012
diff
changeset
|
323 class Executive(object): |
| 23547 | 324 |
| 325 def __init__(self, rpchandler): | |
|
23995
41468f9353ce
Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents:
23876
diff
changeset
|
326 self.rpchandler = rpchandler |
|
25020
e41058845b79
1. Revert subprocess environment clearing, will restart subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
24559
diff
changeset
|
327 self.locals = __main__.__dict__ |
|
25691
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
328 self.calltip = CallTips.CallTips() |
|
35891
8fd46b660e66
Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
34945
diff
changeset
|
329 self.autocomplete = AutoComplete.AutoComplete() |
| 23547 | 330 |
| 331 def runcode(self, code): | |
|
43512
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
332 global interruptable |
| 28096 | 333 try: |
|
29353
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
334 self.usr_exc_info = None |
|
43512
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
335 interruptable = True |
|
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
336 try: |
|
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
337 exec code in self.locals |
|
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
338 finally: |
|
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
339 interruptable = False |
| 28096 | 340 except: |
|
29353
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
341 self.usr_exc_info = sys.exc_info() |
| 29254 | 342 if quitting: |
|
29281
4992c60d422b
Added a config-main General option to delete sys.exitfunc. The default
Kurt B. Kaiser <kbk@shore.net>
parents:
29254
diff
changeset
|
343 exit() |
| 29254 | 344 # even print a user code SystemExit exception, continue |
| 345 print_exception() | |
|
29353
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
346 jit = self.rpchandler.console.getvar("<<toggle-jit-stack-viewer>>") |
|
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
347 if jit: |
|
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
348 self.rpchandler.interp.open_remote_stack_viewer() |
| 28385 | 349 else: |
|
29076
ad84fe58ec2f
1. RemoteDebugger now runs user code in subprocess MainThread
Kurt B. Kaiser <kbk@shore.net>
parents:
29034
diff
changeset
|
350 flush_stdout() |
| 23547 | 351 |
| 27920 | 352 def interrupt_the_server(self): |
|
43512
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
353 if interruptable: |
|
37d8270ac8d9
Allow interrupt only when executing user code in subprocess
Kurt B. Kaiser <kbk@shore.net>
parents:
35891
diff
changeset
|
354 thread.interrupt_main() |
| 28385 | 355 |
|
23876
832f0501148b
Polish RemoteDebugger code.
Kurt B. Kaiser <kbk@shore.net>
parents:
23547
diff
changeset
|
356 def start_the_debugger(self, gui_adap_oid): |
|
23995
41468f9353ce
Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents:
23876
diff
changeset
|
357 return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid) |
|
41468f9353ce
Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents:
23876
diff
changeset
|
358 |
|
41468f9353ce
Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents:
23876
diff
changeset
|
359 def stop_the_debugger(self, idb_adap_oid): |
|
41468f9353ce
Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents:
23876
diff
changeset
|
360 "Unregister the Idb Adapter. Link objects and Idb then subject to GC" |
|
41468f9353ce
Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents:
23876
diff
changeset
|
361 self.rpchandler.unregister(idb_adap_oid) |
| 23547 | 362 |
|
25691
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
363 def get_the_calltip(self, name): |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
364 return self.calltip.fetch_tip(name) |
|
b39bd03a8dab
M CallTips.py Add support for getting calltip from subprocess,
Kurt B. Kaiser <kbk@shore.net>
parents:
25020
diff
changeset
|
365 |
|
35891
8fd46b660e66
Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
34945
diff
changeset
|
366 def get_the_completion_list(self, what, mode): |
|
8fd46b660e66
Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
34945
diff
changeset
|
367 return self.autocomplete.fetch_completions(what, mode) |
|
8fd46b660e66
Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
34945
diff
changeset
|
368 |
| 23547 | 369 def stackviewer(self, flist_oid=None): |
|
29353
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
370 if self.usr_exc_info: |
|
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
371 typ, val, tb = self.usr_exc_info |
|
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
372 else: |
| 23547 | 373 return None |
| 374 flist = None | |
| 375 if flist_oid is not None: | |
|
23995
41468f9353ce
Shutdown subprocess debugger and associated Proxies/Adapters when closing
Kurt B. Kaiser <kbk@shore.net>
parents:
23876
diff
changeset
|
376 flist = self.rpchandler.get_remote_proxy(flist_oid) |
| 23547 | 377 while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]: |
| 378 tb = tb.tb_next | |
|
29353
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
379 sys.last_type = typ |
|
b1395014714a
Modify the remote stack viewer to work in the threaded subprocess.
Kurt B. Kaiser <kbk@shore.net>
parents:
29281
diff
changeset
|
380 sys.last_value = val |
| 23547 | 381 item = StackViewer.StackTreeItem(flist, tb) |
| 382 return RemoteObjectBrowser.remote_object_tree_item(item) |
