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

问题描述 投票:2回答:3

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

示例脚本:

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杀死子项(附加子进程)?

任何帮助,或指向我的方向都非常感激。我目前正在寻找一个好方法。

python subprocess system-calls kill
3个回答
5
投票

你在try / except块中拥有的东西过于宽松,这样当按下Ctrl + C时,KeyboardInterrupt异常也会被与print "Command Failed"相同的异常处理程序处理,并且现在在那里正确处理,流程该程序继续通过for循环。你应该做的是:

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

0
投票

您可以捕获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"

但是我赞同其他海报,因为你的例外太模糊了,你应该更加具体,哪些可以失败,哪些失败。


0
投票

我认为Ctrl + Z还可以帮助您将执行推送到后台并暂停。

© www.soinside.com 2019 - 2024. All rights reserved.