Ctrl C won';Python中的t kill循环子进程

Ctrl C won';Python中的t kill循环子进程,python,subprocess,system-calls,kill,Python,Subprocess,System Calls,Kill,是否有一种正确的方法来创建一个脚本,该脚本在文件夹中的文件中循环,并执行一个可以用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.

是否有一种正确的方法来创建一个脚本,该脚本在文件夹中的文件中循环,并执行一个可以用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杀死child(其他子进程)


非常感谢您的帮助,或为我指点方向。我目前正在寻找一个好的方法来做

try/except块中的内容过于随意,因此当按下Ctrl+C时,
KeyboardInterrupt
异常也由与
print“Command Failed”
异常处理程序相同的异常处理程序来处理,由于该异常处理程序现在在那里得到了正确处理,因此程序流将继续通过for循环。你应该做的是:

  • Exception:
    替换为
    Exception:
    ,这样
    键盘中断
    异常将不会被捕获,这样每当按下Ctrl+C时,程序将终止(包括未处于某种不可终止状态的子进程)
  • print
    语句之后,
    中断循环以防止进一步执行,如果这是您希望此程序执行的预期行为

  • 我认为Ctrl+Z还可以帮助您将执行推到后台并挂起。

    您可以捕获
    键盘中断,这样您就可以以任何方式处理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"
    

    但是,我同意其他海报中的观点,即您的异常过于模糊,您应该更具体地说明什么可以失败,什么不可以失败。

    为什么不在打印“命令失败”后,在捕获异常时退出您的程序通过在代码中添加信号处理,您可以得到比这更复杂的结果,当一个孩子死亡时,您会被调用,但在这种情况下,您似乎只想在出现故障时停止循环。。。或者你是说在这种情况下你没有例外?@Steve我不知道为什么我还没有试过。哈哈,我还真没想到。谢谢如果我想尝试更复杂的信号处理,我会怎么做?我能在子流程返回时检查其状态吗?谢谢您的回复。我也会试试这个。:)我一定会回复更新。