将shell中的陷阱静音

时间:2016-11-28 13:53:29

标签: python shell signals sigint bash-trap

我有一个shell脚本,我用来调用许多python脚本。我在我的shell脚本中添加了一个陷阱来捕获ctrl + c并退出。但是如果python脚本正在运行并且我点击了ctrl + c,它还会显示正在执行的python脚本块!我不要那个。我知道更好的方法是在我的python脚本中添加KeyboardInterrupt,但这需要付出很多努力。我想要一个解决方案,当我按下ctrl + c时,te控制脚本执行以静默方式结束。

例如: a.sh:

   control_c() {
    echo
    echo 'Keyboard Interrupt'
    exit
}
trap control_c INT
python b.py

b.py:

from time import sleep
sleep(50)

当我运行a.sh并点击ctrl + c时,我不想看到这样的python块:

^CTraceback (most recent call last):
  File "b.py", line 3, in <module>
    sleep(50)
KeyboardInterrupt

Keyboard Interrupt

我想让它退出一个简单的键盘中断&#39;消息。

2 个答案:

答案 0 :(得分:1)

我不确定这是一个好习惯,但是如果你需要它,只需在try / except语句中包裹你的sleep

try:
    sleep(50)
except KeyboardInterrupt:
    pass

因OP评论而编辑:

你可以做一个捕捉KeyboardInterrupt的Python包装器,它非常脏,但你可以这样做:

import imp
try:
    imp.load_source('module.name', '/path/to/script.py')
except KeyboardInterrupt:
    exit()

因为你的python文件(/path/to/script.py)不是lib而是一个脚本,它将在加载时执行,所以你可以捕获一层上层的错误,所以以更通用的方式执行。你肯定必须处理我认为的其他问题,但我应该做这项工作。

您可以查看this question以获取有关imp以及如何加载python库的更多信息。

答案 1 :(得分:0)

您可以简单地将标准输出到/ dev / null

#!/usr/bin/env bash

control_c() {
    echo
    echo "Keyboard Interrupt"
    exit
}

trap control_c INT
python b.py 2>/dev/null