Приглушить ловушку в сценарии оболочки
У меня есть сценарий оболочки, который я использую для вызова многих сценариев Python. Я добавил ловушку в свой сценарий оболочки, чтобы поймать Ctrl+ C и выйти. Но если скрипт Python запущен, и я нажал Ctrl+ C, он также показывает блок скрипта Python, который выполнялся! Я не хочу этого. Я знаю, что лучшим способом было бы добавить KeyboardInterrupt в мои скрипты Python, но это потребует много усилий. Я хочу, чтобы решение было таким, чтобы при нажатии Ctrl+ C, управление сценарием завершалось беззвучно.
например: 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
Я хочу, чтобы он завершился простым сообщением "Прерывание клавиатуры".
2 ответа
Я не уверен, что это хорошая практика, но если вам это нужно, просто оберните sleep
в заявлении "попробуй / кроме".
try:
sleep(50)
except KeyboardInterrupt:
pass
Изменить из-за комментария OP:
Вы можете сделать обертку Python, которая ловит KeyboardInterrupt, она довольно грязная, но вы можете сделать что-то вроде:
import imp
try:
imp.load_source('module.name', '/path/to/script.py')
except KeyboardInterrupt:
exit()
Поскольку ваш файл python (/path/to/script.py) - это не библиотека, а скрипт, он будет выполняться при загрузке, поэтому вы можете отлавливать ошибки на один уровень выше и делать это более общим способом. Вам, безусловно, придется решать другие вопросы, я думаю, но я должен сделать эту работу.
Вы можете проверить этот вопрос для получения дополнительной информации о Imp и о том, как загрузить библиотеки Python.
Вы можете просто поместить свой стандарт в /dev/null
#!/usr/bin/env bash
control_c() {
echo
echo "Keyboard Interrupt"
exit
}
trap control_c INT
python b.py 2>/dev/null