如果在子进程执行时执行Ctrl + C,Python是否总是引发异常?

时间:2013-11-06 08:25:52

标签: python

给出以下代码:

try:
  subprocess.Popen(ExternalProcess, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).communicate()
except KeyboardInterrupt:
  exit(0)

如果在执行ExternalProcess(不是python脚本)期间按下 Ctrl + C 命令,究竟发生了什么?< / p>

我可以确定100%在此范围内,如果按 Ctrl + C ,它将始终进入'除',即使它在执行ExternalProcess期间发生了什么?

或者它取决于外部流程如何处理它?

2 个答案:

答案 0 :(得分:19)

据我所知,一旦你分叉/执行一个进程,它就会继承父进程process group。这意味着,SIGINT(这是 Ctrl + C 的结果和KeyboardInterrupt的原因)将被发送给孩子和父母。

以下是一个例子:

档案a.py

import subprocess

try:
    subprocess.Popen("python b.py".split()).communicate()
except KeyboardInterrupt:
    print "a.py got ctrl-c"

档案b.py

try:
    while True: pass
except KeyboardInterrupt:
    print "b.py got ctrl-c"

现在你运行它并停止:

> python a.py
^Cb.py got ctrl-c
a.py got ctrl-c

答案 1 :(得分:2)

我假设你在我的回答中使用了Unix变体。我对Windows世界没有更深入的了解。

如果一切都正常配置,那么C-c将由终端解释(xterm,gnome-terminal,...)。此终端将发送一个SIGINT(请参阅kill -l以查找系统的编号,通常是2)连接到与此终端关联的tty设备的进程组的所有进程。这可能是shell启动的shell或程序(及其所有子代,因为进程组被继承)。

然而,孩子可以自愿离开其过程组并创建一个新的过程组。守护程序进程通常这样做是为了避免在父程序中按下 Ctrl-C 意外杀死。