Ctrl C 不会终止 Python 中的循环子进程

Ctrl C won't kill looped subprocess in 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 杀死孩子(附加子进程)?

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

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

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

我觉得 Ctrl + Z 也可以帮你把执行推到后台挂起

你可以抓住 KeyboardInterrupt,这样你就可以用任何你想要的方式处理 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 KeyboardInterrupt as e:
        print "Interrupted"
        sys.exit(1)
    except:
        print "Command Failed"

不过我同意其他发帖人的观点,你的例外太模糊了,你应该更具体地说明什么可以失败,什么不能失败。