【问题标题】:Ctrl C won't kill looped subprocess in PythonCtrl C 不会杀死 Python 中的循环子进程
【发布时间】:2019-03-21 03:30:16
【问题描述】:

有没有合适的方法来创建一个循环遍历文件夹中的文件并执行一个可以用 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杀死孩子(额外的子进程)?

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

【问题讨论】:

  • 为什么在打印“命令失败”后捕获异常时不退出程序? - 您可以通过向您的代码添加信号处理来获得比这更复杂的情况,当孩子死亡时调用该代码,但在这种情况下,您似乎只想在失败时停止循环。 ...或者你是说在这种情况下你没有得到例外?
  • @Steve 我不知道为什么我还没有尝试过。大声笑那字面上还没有打到我。谢谢!如果我想尝试更复杂的信号处理,我会怎么做?子进程返回时我会检查它的状态吗?

标签: python subprocess system-calls kill


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我也会试试这个。 :) 我一定会回复更新。
【解决方案2】:

你可以抓住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"

但我同意其他发帖者的观点,因为您的例外过于模糊,您应该更具体地说明什么可以失败,什么不能失败。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2021-12-15
      • 2021-02-23
      • 2019-07-13
      相关资源
      最近更新 更多