2009-09-01 144 views
78

我有一个python脚本,它使用线程并发出大量的HTTP请求。我认为发生的事情是,当HTTP请求(使用urllib2)正在读取时,它会阻止并且不响应CtrlC停止该程序。有没有办法解决?使用ctrl + c停止python

+7

我不知道为什么,但至少在OS X上,使用Control +反斜杠导致它终止,并且你得到一个“python崩溃”的对话......奇怪。不是真正有用的信息,因此它是一个评论! – micmoo 2009-09-01 20:18:34

+3

实际上它适用于终端中的所有应用程序...... – micmoo 2009-09-01 20:19:15

+0

David Beazley描述了Ctrl/C中断如何将多线程Python脚本转换为CPU。这里有一个链接Beazley谈话的内容(http://stackoverflow.com/questions/990102/python-global-interpreter-lock-gil-workaround-on-multi-core-systems-using-tasks)。 – 2009-09-02 07:09:39

回答

104

在Windows中,唯一可靠的方法是使用Ctrl键。立即停止每个Python脚本!

(请注意,某些键盘上,“破发”被标记为“暂停”。)

+1

它的工作原理,谢谢 – jonatron 2009-09-01 19:29:46

+2

什么是'Break'?我如何输入它? – u0b34a0f6ae 2009-09-01 19:44:48

+5

键盘上应该有一个Pause_Break按钮 – jonatron 2009-09-01 20:10:18

35

如果在Python外壳采用按Ctrl +ž运行,否则找到python进程和杀死它。

+19

'^ Z' - >'[1] +停止' - >'kill%1'停止作业#1(或bash放置作业%1) – u0b34a0f6ae 2009-09-01 19:44:06

+0

yes! Ctrl + Z适合我! – 2013-04-20 03:11:56

+15

值得添加的答案是Ctrl + Z只是*暂停*进程。 – 2013-08-24 14:50:21

56

按Ctrl +ç一个 Python程序运行后会导致蟒蛇养KeyboardInterupt例外一段时间。很多HTTP请求的程序可能会有很多异常处理代码。如果try-except块的except部分没有指定它应该捕获哪些异常,它将捕获所有异常,包括刚刚引起的KeyboardInterupt。一个正确编码的python程序将使用python exception hierarchy,并且只捕获异常派生的异常。

#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 KeyboardInterupt 

如果你不能改变的代码(或需要杀死的程序,以便您的更改将生效),那么你可以尝试按下Ctrl键+Ç迅速。第一个KeyboardInterupt异常会将你的程序从try块中取出,希望当程序在try块之外时,将会引发KeyboardInterrupt之后的异常。

+0

这是启用最常见的“break”是ctrl + c。 – Xerion 2016-04-21 19:09:22

22

中断过程是硬件和操作系统相关的。所以你将会有非常不同的行为,这取决于你在哪里运行你的python脚本。例如,在Windows机器上,我们有按Ctrl +ÇSIGINT)和按Ctrl +休息SIGBREAK)。

因此,尽管SIGINT存在于所有系统,可以处理和捕获,SIGBREAK信号是Windows特定(并可以在CONFIG.SYS被禁用),是否真由BIOS处理的中断矢量INT 1Bh,这就是为什么这个键比其他任何键都强大得多。所以如果你使用的是一些* nix风格的操作系统,你会得到不同的结果,这取决于实现,因为那个信号不存在于那里,但其他的都是。在Linux中,您可以检查信号是什么提供给您的是:如果你想赶上CTRL+BREAKsignal Linux系统,你必须检查哪些POSIX signal他们绘制了关键的

$ 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 

左右。热门映射是:

CTRL+\  = SIGQUIT 
CTRL+D  = SIGQUIT 
CTRL+C  = SIGINT 
CTRL+Z  = SIGTSTOP 
CTRL+BREAK = SIGKILL or SIGTERM or SIGSTOP 

事实上,越来越多的功能的Linux,其中SysRq的(系统请求)键可以在a life of its own下可...

11

这个职位是旧的,但我最近遇到同样的问题CTRL+C没有终止我的Linux上的python脚本。我用了CTRL + \SIGQUIT)。

+0

谢谢!简洁。 – 2016-11-25 18:57:11

+0

尽管它会导致核心转储,但它确实停止了脚本,谢谢 – ospider 2017-12-14 02:42:56

0

开/在终端的Mac:

  1. 显示检查(终端窗口或外壳>显示检查内右击)
  2. 点击上述“正在运行的进程”
  3. 然后从设置图标“信号处理组”下的选项列表(杀死,终止,中断等)。
-1

ctrl + q会立即停止运行代码并关闭所有窗口。

1

在Mac按下:

“对照” + “\”

退出连接到终端的蟒过程。

相关问题