13
13
"""
14
14
15
15
import code
16
+ import threading
16
17
import signal
17
18
import greenlet
18
19
import logging
@@ -130,16 +131,19 @@ def run_code(self, for_code=None):
130
131
if source code is complete, returns "done"
131
132
if source code is incomplete, returns "unfinished"
132
133
"""
134
+ is_main_thread = isinstance (threading .current_thread (), threading ._MainThread )
133
135
if self .code_context is None :
134
136
assert self .source is not None
135
137
self .code_context = greenlet .greenlet (self ._blocking_run_code )
136
- self .orig_sigint_handler = signal .getsignal (signal .SIGINT )
137
- signal .signal (signal .SIGINT , self .sigint_handler )
138
+ if is_main_thread :
139
+ self .orig_sigint_handler = signal .getsignal (signal .SIGINT )
140
+ signal .signal (signal .SIGINT , self .sigint_handler )
138
141
request = self .code_context .switch ()
139
142
else :
140
143
assert self .code_is_waiting
141
144
self .code_is_waiting = False
142
- signal .signal (signal .SIGINT , self .sigint_handler )
145
+ if is_main_thread :
146
+ signal .signal (signal .SIGINT , self .sigint_handler )
143
147
if self .sigint_happened_in_main_context :
144
148
self .sigint_happened_in_main_context = False
145
149
request = self .code_context .switch (SigintHappened )
@@ -157,7 +161,8 @@ def run_code(self, for_code=None):
157
161
return False
158
162
elif isinstance (request , (Done , Unfinished )):
159
163
self ._unload_code ()
160
- signal .signal (signal .SIGINT , self .orig_sigint_handler )
164
+ if is_main_thread :
165
+ signal .signal (signal .SIGINT , self .orig_sigint_handler )
161
166
self .orig_sigint_handler = None
162
167
return request
163
168
elif isinstance (request , SystemExitRequest ):
0 commit comments