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

use*_*550 28 python

给出以下代码:

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

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

我是否可以确定100%在此范围内,如果我按下Ctrl+ C,即使它在执行期间发生,它也总会进入'除外' ExternalProcess

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

ber*_*eal 19

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

这是一个例子:

档案a.py:

import subprocess

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

文件 b.py

try:
    while True: pass
except KeyboardInterrupt:
    print "b.py got ctrl-c"
Run Code Online (Sandbox Code Playgroud)

现在你运行它并停止:

> python a.py
^Cb.py got ctrl-c
a.py got ctrl-c
Run Code Online (Sandbox Code Playgroud)

  • @freakish:终端将信号发送给同一进程组的所有成员.见http://www.cs.ucsb.edu/~almeroth/classes/W99.276/assignment1/signals.html (2认同)