Ctrl C不会杀死Python中循环的子进程

ENZ*_*SIO 3 python subprocess kill system-calls

是否有适当的方法来创建一个脚本,该脚本循环遍历文件夹中的文件并执行可以用Ctrl C在外部终止的子进程?我在管道中嵌入了类似以下内容的内容,当主进程被杀死时,无法从命令行Ctrl C进行操作。

示例脚本:

import subprocess
import os
import sys

input_directory = sys.argv[1]

for file in os.listdir(os.path.abspath(input_directory)):
    output = file + "_out.out"
    command = ['somescript.py', file, output]
    try:
        subprocess.check_call(command)
    except:
        print "Command Failed"
Run Code Online (Sandbox Code Playgroud)

然后我将执行程序:

Example_script.py /path/to/some/directory/containing/files/
Run Code Online (Sandbox Code Playgroud)

在循环时,如果我看到命令失败,我想使用CtrlC。但是,尽管主脚本已被Ctrl C销毁,但它仍然失败并继续运行其他子进程。是否有适当的方式编写这样的代码可以使用Ctrl C杀死孩子(其他子过程)?

任何帮助,或指出我的方向,不胜感激。我目前正在寻找一种好方法。

met*_*ter 5

您在try / except块中拥有的内容太宽容,以致于在按下Ctrl+ 时C,该KeyboardInterrupt异常也由与相同的异常处理程序进行处理print "Command Failed",并且由于现在已经在那里正确处理,因此程序流为继续通过for循环。您应该做的是:

  1. 替换为except:except Exception:这样KeyboardInterrupt就不会捕获异常,以便在任何时候按下Ctrl+ C,程序都将终止(包括未陷入某些不可终止状态的子流程);
  2. print声明之后break,如果这是您希望此程序执行的预期行为,请跳出循环以防止进一步执行。