首页 > 解决方案 > Ctrl C 不会杀死 Python 中的循环子进程

问题描述

有没有合适的方法来创建一个循环遍历文件夹中的文件并执行可以用 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"

然后我会执行程序:

Example_script.py /path/to/some/directory/containing/files/

当它在循环时,如果我看到命令失败,我想使用 Ctrl C。但是,尽管主脚本已经用 Ctrl C 破坏了,但它失败并继续运行其他子进程。有没有合适的方法来写这样的东西可以用 Ctrl C 杀死孩子(额外的子进程)吗?

非常感谢任何帮助或指出我的方向。我目前正在寻找一种好的方法。

标签: pythonsubprocesssystem-callskill

解决方案


您在 try/except 块中的内容过于宽松,因此当按下Ctrl+时,异常也由与 that 相同的异常处理程序处理,并且现在在那里正确处理,程序的流程是继续通过 for 循环。你应该做的是:CKeyboardInterruptprint "Command Failed"

  1. 替换except:为,except Exception:这样KeyboardInterrupt异常就不会被捕获,这样只要按下Ctrl+ C,程序就会终止(包括没有卡在某些不可终止状态的子进程);
  2. print语句之后,break退出循环以防止发生进一步的执行,如果这是您希望该程序执行的预期行为。

推荐阅读