Не удается получить keysInterrupt для перехвата Ctrl C в программе Python, работающей в Linux
Я хочу, чтобы моя программа перестала выполняться при вводе ctrl-c в окне терминала (в котором есть фокус), где выполняется программа. Каждый хит Google говорит мне, что это должно работать, но это не так.
Сначала я попытался поместить блок try в метод класса, который вызывал мой main:
try:
for row in csvInput:
<process the current row...>
except KeyboardInterrupt:
print '\nTerminating program!\n'
exit()
и затем я попытался вставить блок try в мою основную программу, и это не сработало:
if __name__ == '__main__':
try:
programArg = ProgramArgs(argparse.ArgumentParser)
args = programArg.processArgs()
currentDir = os.getcwd()
product = Product(currentDir, args.directory[0], programArg.outputDir)
product.verify()
except KeyboardInterrupt:
print '\nTerminating program!\n'
exit()
0 ответов
Недавно (2 мая 2020 г.) я столкнулся с этой же проблемой в Windows-10, используя Anaconda2-Spyder(Python2.7). Я новичок в использовании Spyder. Я пробовал несколько способов заставить [break] или [ctrl-c] работать должным образом, попробовав несколько предложений, перечисленных в stackru. Казалось, ничего не работает. Однако, в конце концов, я заметил, что программа останавливается на строке, найденной после перехвата "KeyboardInterrupt".
[Решение]: выберите [Выполнить текущую строку] или [Продолжить выполнение] в инструментах отладчика (либо пункт меню, либо функции значка), и остальная часть программы будет выполнена, и программа завершится должным образом. Я построил следующее, чтобы поэкспериментировать с вводом с клавиатуры.
def Test(a=0,b=0):
#Simple program to test Try/Catch or in Python try/except.
#[break] using [Ctrl-C] seemed to hang the machine.
#Yes, upon [Ctrl-C] the program stopped accepting User #
Inputs but execution was still "hung".
def Add(x,y):
result = x+y
return result
def getValue(x,label="first"):
while not x:
try:
x=input("Enter {} value:".format(label))
x = float(x)
continue
except KeyboardInterrupt:
print("\n\nUser initiated [Break] detected." +
"Stopping Program now....")
#use the following without <import sys>
raise SystemExit
#otherwise, the following requires <import sys>
#sys.exit("User Initiated [Break]!")
except Exception:
x=""
print("Invalid entry, please retry using a " +
"numeric entry value (real or integer #)")
continue
return x
print ("I am an adding machine program.\n" +
"Just feed me two numbers using "Test(x,y) format\n" +
"to add x and y. Invalid entries will cause a \n" +
"prompt for User entries from the keyboard.")
if not a:
a = getValue(a,"first")
if not b:
b = getValue(b,"second")
return Add(a,b)