I have a python script that uses threads and makes lots of HTTP requests. I think what's happening is that while a HTTP request (using urllib2) is reading, it's blocking and not responding to CtrlC to stop the program. Is there any way around this?
-
12I don't know why, but at least on OS X, using Control + Backslash causes it to terminate and you get a "python crashed" dialog... strange. Not really that useful info, thus it is a comment! – micmoo Sep 01 '09 at 20:18
-
3Actually it works on all applications in Terminal... – micmoo Sep 01 '09 at 20:19
-
1David Beazley has described how a Ctrl/C interrupt can turn a muli-threaded Python script into a CPU hog. It's touched on here (http://stackoverflow.com/questions/990102/python-global-interpreter-lock-gil-workaround-on-multi-core-systems-using-tasks) with a link to Beazley's talk. – Ned Deily Sep 02 '09 at 07:09
13 Answers
On Windows, the only sure way is to use CtrlBreak. Stops every python script instantly!
(Note that on some keyboards, "Break" is labeled as "Pause".)

- 39,853
- 6
- 84
- 117

- 2,966
- 4
- 25
- 20
-
11
-
8
-
22What if there isn't? I'm on a Intel Macbook, and it doesn't have a very full-featured keyboard. – Bluu Sep 24 '10 at 22:03
-
Ctrl+Break isn't working for me on Linux, neither does Ctrl+z mentioned below. The only thing that seems to work is pressing Ctrl+c rapidly until the command prompt shows up again. – tponthieux Dec 01 '12 at 02:38
-
64
-
1Ctrl + break not only kills the python script but also PowerShell – Adonis K. Kakoulidis Oct 13 '13 at 22:36
-
13ctrl+Z doesn't kill the script, it just hides it to the background and suspends it. You can type fg to recall it. – Shady Xu Mar 21 '14 at 03:20
-
I want to point out that ctrl+c does not **kill** the script, it **stops** the script, putting it in the shell's background, elaborated upon here http://unix.stackexchange.com/questions/116959/there-are-stopped-jobs-on-bash-exit – ThorSummoner Apr 06 '14 at 09:44
-
5`Ctrl+Fn+F6` or `Ctrl+Fn+S ` on Dell laptops without break key – Jarek Przygódzki Nov 07 '17 at 09:09
-
4if you don't have ctrl+break and nothing else works, fire up the on screen keyboard (start > run > `osk`), click on `ctrl` and then click on `scroll lock`. – Kinjal Dixit Jun 29 '18 at 08:30
-
-
Pressing Ctrl + c while a python program is running will cause python to raise a KeyboardInterrupt
exception. It's likely that a program that makes lots of HTTP requests will have lots of exception handling code. If the except
part of the try
-except
block doesn't specify which exceptions it should catch, it will catch all exceptions including the KeyboardInterrupt
that you just caused. A properly coded python program will make use of the python exception hierarchy and only catch exceptions that are derived from Exception
.
#This is the wrong way to do things
try:
#Some stuff might raise an IO exception
except:
#Code that ignores errors
#This is the right way to do things
try:
#Some stuff might raise an IO exception
except Exception:
#This won't catch KeyboardInterrupt
If you can't change the code (or need to kill the program so that your changes will take effect) then you can try pressing Ctrl + c rapidly. The first of the KeyboardInterrupt
exceptions will knock your program out of the try
block and hopefully one of the later KeyboardInterrupt
exceptions will be raised when the program is outside of a try
block.

- 27,591
- 48
- 66
- 103

- 17,926
- 9
- 33
- 53
-
1This is a great answer to enable the most common "break" which is ctrl+c. – Xerion Apr 21 '16 at 19:09
-
1Not for me. I have only a single `except KeyboardInterrupt` case and still it won't trigger, unless the application is waiting for user keyboard input. Windows completely ignores the Ctrl+C – Bersan Feb 08 '22 at 12:20
If it is running in the Python shell use Ctrl + Z, otherwise locate the python
process and kill it.

- 344,730
- 71
- 640
- 635
-
27`^Z` --> `[1]+ Stopped ` --> `kill %1` to stop job #1 (or job %1 as bash puts it) – u0b34a0f6ae Sep 01 '09 at 19:44
-
28Worth adding to the answer that Ctrl+Z just *pauses* the process. – Matteo Italia Aug 24 '13 at 14:50
-
4To elaborate on the above: Pausing the process keeps it around in memory and in your shell, it just prevents it from using CPU resources. Files, sockets, everything is still open and in use. In fact, typing `fg` will bring it right back. – RandomInsano Aug 12 '16 at 14:29
-
5`Ctrl+Z` is not the proper way to stop a python script and should be avoided unless you plan on resuming the paused process. – Josh Correia Jan 31 '20 at 20:55
-
The interrupt process is hardware and OS dependent. So you will have very different behavior depending on where you run your python script. For example, on Windows machines we have Ctrl+C (SIGINT
) and Ctrl+Break (SIGBREAK
).
So while SIGINT is present on all systems and can be handled and caught, the SIGBREAK signal is Windows specific (and can be disabled in CONFIG.SYS) and is really handled by the BIOS as an interrupt vector INT 1Bh, which is why this key is much more powerful than any other. So if you're using some *nix flavored OS, you will get different results depending on the implementation, since that signal is not present there, but others are. In Linux you can check what signals are available to you by:
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGEMT 8) SIGFPE 9) SIGKILL 10) SIGBUS
11) SIGSEGV 12) SIGSYS 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGURG 17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD
21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGPWR 30) SIGUSR1
31) SIGUSR2 32) SIGRTMAX
So if you want to catch the CTRL+BREAK
signal on a linux system you'll have to check to what POSIX signal they have mapped that key. Popular mappings are:
CTRL+\ = SIGQUIT
CTRL+D = SIGQUIT
CTRL+C = SIGINT
CTRL+Z = SIGTSTOP
CTRL+BREAK = SIGKILL or SIGTERM or SIGSTOP
In fact, many more functions are available under Linux, where the SysRq (System Request) key can take on a life of its own...
Ctrl+D Difference for Windows and Linux
It turns out that as of Python 3.6, the Python interpreter handles Ctrl+C differently for Linux and Windows. For Linux, Ctrl+C would work mostly as expected however on Windows Ctrl+C mostly doesn't work especially if Python is running blocking call such as thread.join
or waiting on web response. It does work for time.sleep
, however. Here's the nice explanation of what is going on in Python interpreter. Note that Ctrl+C generates SIGINT
.
Solution 1: Use Ctrl+Break or Equivalent
Use below keyboard shortcuts in terminal/console window which will generate SIGBREAK
at lower level in OS and terminate the Python interpreter.
Mac OS and Linux
Ctrl+Shift+\ or Ctrl+</kbd>
Windows:
- General: Ctrl+Break
- Dell: Ctrl+Fn+F6 or Ctrl+Fn+S
- Lenovo: Ctrl+Fn+F11 or Ctrl+Fn+B
- HP: Ctrl+Fn+Shift
- Samsung: Fn+Esc
Solution 2: Use Windows API
Below are handy functions which will detect Windows and install custom handler for Ctrl+C in console:
#win_ctrl_c.py
import sys
def handler(a,b=None):
sys.exit(1)
def install_handler():
if sys.platform == "win32":
import win32api
win32api.SetConsoleCtrlHandler(handler, True)
You can use above like this:
import threading
import time
import win_ctrl_c
# do something that will block
def work():
time.sleep(10000)
t = threading.Thread(target=work)
t.daemon = True
t.start()
#install handler
install_handler()
# now block
t.join()
#Ctrl+C works now!
Solution 3: Polling method
I don't prefer or recommend this method because it unnecessarily consumes processor and power negatively impacting the performance.
import threading
import time
def work():
time.sleep(10000)
t = threading.Thread(target=work)
t.daemon = True
t.start()
while(True):
t.join(0.1) #100ms ~ typical human response
# you will get KeyboardIntrupt exception

- 2,837
- 1
- 20
- 34

- 63,284
- 17
- 238
- 185
-
No, on Ubuntu, for both python 2.7 and 3.6, pressing `ctrl + c` doesn't quit but showing `KeyboardInterrupt`. – Rick Mar 28 '19 at 11:32
-
I like the thread example, but you don't need to use the `SetConsoleCtrlHandler()`. You can just do a `try: time.sleep(5);except KeyboardInterrupt: break;` in a `while 1` loop. This works with any long delay for event handlers, but should be used with care when using polling and using not less time than: `time.sleep(0.01)`. – not2qubit Jan 03 '21 at 08:07
-
Thanks. However, solution 1 would require end user awareness, which they probably do not have (unless they came here and read this answer :-) ). Solution 2 relies on platform specific API. I ended up using solution 3. – RayLuo Sep 09 '21 at 16:36
-
-
This post is old but I recently ran into the same problem of Ctrl+C not terminating Python scripts on Linux. I used Ctrl+\ (SIGQUIT
).

- 3,807
- 3
- 33
- 50

- 15,881
- 6
- 52
- 96
-
Although it will cause a core dump, but it did stops the script, thanks – ospider Dec 14 '17 at 02:42
On Mac press Ctrl+\ to quit a python process attached to a terminal.

- 3,807
- 3
- 33
- 50

- 7,048
- 1
- 18
- 19
-
-
Verified, this works on Mac OSX in 2022. Other method although a bit longwinded also works: ctrl+z --> [1]+ Stopped --> kill %1 – binjiezhao Dec 14 '22 at 10:05
Capture the KeyboardInterrupt
(which is launched by pressing ctrl
+c
) and force the exit:
from sys import exit
try:
# Your code
command = input('Type your command: ')
except KeyboardInterrupt:
# User interrupt the program with ctrl+c
exit()

- 256
- 2
- 6
- Forcing the program to close using Alt+F4 (shuts down current program)
- Spamming the X button on CMD for e.x.
- Taskmanager (first Windows+R and then "taskmgr") and then end the task.
Those may help.
For the record, what killed the process on my Raspberry 3B+ (running raspbian) was Ctrl+'. On my French AZERTY keyboard, the touch ' is also number 4.

- 3,807
- 3
- 33
- 50

- 113
- 1
- 5
You can open your task manager (ctrl + alt + delete, then go to task manager) and look through it for python and the server is called (for the example) _go_app (naming convention is: _language_app).
If I end the _go_app task it'll end the server, so going there in the browser will say it "unexpectedly ended", I also use git bash, and when I start a server, I cannot break out of the server in bash's shell with ctrl + c or ctrl + pause, but once you end the python task (the one using 63.7 mb) it'll break out of the server script in bash, and allow me to use the git bash shell.

- 726
- 8
- 17