1

我有一个 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

我希望它以简单的“键盘中断”消息退出。

4

2 回答 2

1

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

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,而是一个脚本,它会在加载时执行,所以你可以在上一层捕获错误,所以以更通用的方式进行。我认为你肯定必须处理其他问题,但我应该做这项工作。

您可以查看此问题以了解有关 imp 以及如何加载 python 库的更多信息。

于 2016-11-28T14:06:48.353 回答
0

您可以简单地将标准放在 /dev/null

#!/usr/bin/env bash

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

trap control_c INT
python b.py 2>/dev/null
于 2016-11-28T14:03:58.150 回答