如何停止/终止正在运行的Python脚本?

174

我在 IDLE 中编写了一个程序来对文本文件进行标记化,并开始对 349 个文本文件进行标记化!我该如何停止它?如何停止正在运行的 Python 程序?


10
ctrl+c 应该可以终止它。或者,用 kill -9 终止它。 - Ayush
1
这里的许多答案都是特定于平台的。请搜索您的平台(Windows、Linux、Mac还是其他什么?) - tripleee
很多朋友花了很多心血写答案,但是都没有被采纳,感觉有点失落。 :-( - Roland
19个回答

209

如果您在代码中使用 exit() 函数,也可以实现此操作。更理想的是,您可以使用 sys.exit()。即使您通过 multiprocessing 包并行运行事物,sys.exit() 也可以可能终止Python。

注意:为了使用 sys.exit(),您必须导入它:import sys


9
注意:我找到了一些例子,其中 sys.exit(1) 无法停止进程。我基本上有多个线程,每个线程都会阻塞在由 Popen 启动的外部进程上。我需要一个核选项来杀死 Python 进程创建的所有子进程以及 Python 进程本身。到目前为止还没有找到。 - Dici
sys.exit()不会终止进程,而是引发SystemExit异常,这不会通过关闭程序来停止执行。 - c24b

79

要停止程序,只需按下Control + C


39
这种方法在我的Windows笔记本电脑上有效,但在我的Linux台式机上,在终端中显示^C,而系统监视器显示Python仍然在大量使用CPU... - user3768495
1
脚本停止后是否有可能恢复运行? - Gathide
18
如果你想暂停进程并将其放在后台,可以按下 Ctrl + Z(至少在Linux上是这样)。然后,如果你想杀死进程,运行 kill %n,其中“n”是你按下 Ctrl + Z 后得到的数字,在“Stopped”旁边。如果你想恢复进程,运行 fg - cluxter
1
如果程序中有一个通用的 except: 子句,那么它将无法正常工作。except: 会捕获中断,执行某些操作(或不执行),然后程序会继续运行。 - DragonLord
@DragonLord 你的一般性异常处理应该有一个专门针对Ctrl+C抛出的异常处理。总的来说,一般性异常处理通常不被鼓励使用。 - Pere

68

如果您的程序在交互式控制台上运行,按下 CTRL + C 将在主线程上引发一个 KeyboardInterrupt 异常。

如果您的Python程序没有捕获它,KeyboardInterrupt 将导致Python退出。然而,except KeyboardInterrupt: 块或类似裸的 except: 会防止这种机制实际上停止脚本运行。

有时,如果 KeyboardInterrupt 不起作用,您可以发送一个 SIGBREAK 信号;在Windows上,CTRL + Pause/Break 可能被解释器处理,而不产生可捕获的 KeyboardInterrupt 异常。

然而,这些机制主要只在Python解释器正在运行并响应操作系统事件时起作用。如果Python解释器由于某些原因无法响应,则最有效的方法是终止运行解释器的整个操作系统进程。该机制因操作系统而异。

在Unix风格的shell环境中,您可以按下CTRL+Z来暂停当前控制控制台的进程。一旦您获得了shell提示符,您可以使用jobs列出挂起的作业,并使用kill %1杀死第一个挂起的作业。(如果要重新开始运行它,您可以使用fg %1在前台继续作业;请查阅您的shell手册以获取更多信息)。
另外,在Unix或类Unix环境中,您可以找到Python进程的PID(进程标识符)并通过PID将其杀死。使用类似ps aux | grep python的命令查找正在运行的Python进程,然后使用kill <pid>发送SIGTERM信号。
在Unix上,kill命令默认发送SIGTERM,Python程序可以使用signal模块安装SIGTERM的信号处理程序。理论上,任何SIGTERM的信号处理程序都应该优雅地关闭进程。但有时,如果进程被阻塞(例如,在不可中断的IO睡眠状态下),SIGTERM信号没有效果,因为进程甚至无法唤醒以处理它。要强制结束一个没有响应信号的进程,你需要发送 SIGKILL 信号,有时也称为 kill -9,因为 9SIGKILL 常量的数值。在命令行中,可以使用 kill -KILL <pid>(或简写为 kill -9 <pid>)来发送 SIGKILL 并立即停止运行的进程。

在Windows上,你没有Unix系统的进程信号,但是可以通过使用 TerminateProcess 函数来强制终止正在运行的进程。交互式地,最简单的方法是打开任务管理器,找到与你的程序对应的 python.exe 进程,并点击 "结束进程" 按钮。你也可以使用 taskkill 命令来达到类似的目的。


62
  • 要停止一个Python脚本,只需按下Ctrl + C
  • 在脚本中使用exit()也可以实现。
  • 在交互式脚本中,你可以直接使用exit来停止。
  • 你可以使用pkill -f Python脚本名称来完成。

2
最后一个选项在你以分离模式运行脚本时特别有用,例如:python script.py& - richar8086
@AEM 哇!多好的答案啊!我一直在寻找一种方法来在脚本外部终止 Python 程序,你的回答正是我需要的!谢谢! - Eitan
@AEM 哇!真是个好答案! 我在寻找一种在脚本外部终止Python程序的方法,你的回答正好就是答案!谢谢! - undefined

60

使用键盘停止Python脚本:Ctrl + C

使用代码停止它(这在Python 3上对我有效):

import os
os._exit(0)

您还可以使用:

import sys
sys.exit()
或者:
exit()
或:
raise SystemExit

1
谢谢。SystemExit是正确的方法。 - Dark Star1
4
只有 os._exit(0) 对我起作用,但其他所有的都不行,很高兴我找到了 os 这个方法,谢谢! - Shavow
1
如果您使用多线程包并且有无休止的线程,那么"raise SystemExit"特别有用。除非您按两次ctrl+c,否则进程不会停止,即使您使用其他方法终止它。但我需要一个自动重启程序 :) - france1
1
对我来说,os._exit(0)也起作用了。谢谢。 - Ratan

50

要停止正在运行的程序,请使用Ctrl+C来终止进程。

在Python中以编程方式处理它,导入sys模块并在想要终止程序的地方使用sys.exit()

import sys
sys.exit()

3
如果从子进程中调用,这将无法运行。 - Michael Litvin

36

Ctrl-BreakCtrl-C更强大。


7
就像丹尼尔·普赖登在他的回答中澄清的那样,键盘上的Break键也可以标记为Pause,以便像我这样感到困惑的人能够理解。 :) - JakeStrang

15

当我在Linux终端上运行Python脚本时,CTRL+\有效。(不是CRTL + CD


这比使用 Ctrl + Z 要好得多,因为后者只是挂起了进程。 - crmpicco

11

Ctrl+Z可以帮你从Python shell中退出。请记住,脚本的实例可能会在后台继续运行,因此在Linux下,您需要杀死相应的进程。


1
当运行(许多)并行进程时,这非常有用,CTRL-C无法杀死它们全部。在CTRL-Z之后,您可以检查jobsps,然后杀死8923754或您需要杀死的任何作业ID /进程ID。 - Paul

9

如果你在Jupyter Notebook里,使用exit()命令可能会导致内核崩溃,所以这不是一个好主意。raise命令可以停止程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接