@@ -3588,10 +3588,12 @@ def cmdloop(self, intro: Optional[str]=None) -> None:
35883588 if callargs :
35893589 self .cmdqueue .extend (callargs )
35903590
3591- # Register a SIGINT signal handler for Ctrl+C
3592- import signal
3593- original_sigint_handler = signal .getsignal (signal .SIGINT )
3594- signal .signal (signal .SIGINT , self .sigint_handler )
3591+ # Only the main thread is allowed to set a new signal handler in Python, so only attempt if that is the case
3592+ if threading .current_thread () is threading .main_thread ():
3593+ # Register a SIGINT signal handler for Ctrl+C
3594+ import signal
3595+ original_sigint_handler = signal .getsignal (signal .SIGINT )
3596+ signal .signal (signal .SIGINT , self .sigint_handler )
35953597
35963598 # Grab terminal lock before the prompt has been drawn by readline
35973599 self .terminal_lock .acquire ()
@@ -3625,8 +3627,9 @@ def cmdloop(self, intro: Optional[str]=None) -> None:
36253627 # This will also zero the lock count in case cmdloop() is called again
36263628 self .terminal_lock .release ()
36273629
3628- # Restore the original signal handler
3629- signal .signal (signal .SIGINT , original_sigint_handler )
3630+ if threading .current_thread () is threading .main_thread ():
3631+ # Restore the original signal handler
3632+ signal .signal (signal .SIGINT , original_sigint_handler )
36303633
36313634 if self .exit_code is not None :
36323635 sys .exit (self .exit_code )
0 commit comments