subprocess.Popen在KeyboardInterrupt

时间:2019-01-18 13:52:49

标签: python bash subprocess

我编写了一个简单的python脚本./vader-shell,该脚本使用subprocess.Popen来启动Spark-shell,我必须处理KeyboardInterrupt,因为否则子进程将不会消失

command = ['/opt/spark/current23/bin/spark-shell']
command.extend(params)

p = subprocess.Popen(command)

try:
  p.communicate()
except KeyboardInterrupt:
  p.terminate() 

这就是我在ps f上看到的

enter image description here

当我实际上用ctrl-C中断时,我看到进程快要死了(大部分时间)。但是终端开始表现得很奇怪:我看不到任何光标,并且所有行开始随机出现

enter image description here

我真的迷失了使用该库运行子流程的最佳方式以及如何处理杀死子流程。我要实现的目标是基本的:每当我的python进程被ctrl-C杀死时,我都希望杀死所有进程族。终止后,我用Google搜索了几种解决方案os.killp.wait(),终止后调用了subprocess.Popen(['reset']),但没有一个起作用。 您知道发生KeyboardInterrupt时最好的杀死方法是什么?还是您知道其他任何更可靠的库可用于启动进程?

1 个答案:

答案 0 :(得分:0)

您的代码没有任何公然错误,问题在于您启动的命令尝试使用当前终端执行操作,并且无法正确关闭关闭位置的设置。将命令替换为如下所示的“睡眠”即可正常运行,并在Ctrl + C上停止就不会出现问题:

import subprocess

command = ['/bin/bash']
command.extend(['-c', 'sleep 600'])

p = subprocess.Popen(command)

try:
  p.communicate()
except KeyboardInterrupt:
  p.terminate()

我不知道您要使用spark-shell做什么,但是如果您不需要它的输出,可以尝试将其重定向到/ dev / null,以免干扰终端显示:

p = subprocess.Popen(command, stdout=subprocess.DEVNULL)