Я пытаюсь использовать KeyboardInterrupt вместе с другими ошибками, но, похоже, это не работает. (У меня уже есть pyautogui и время.) Кстати, новичок в Python.
while true
try:
x, y = pyautogui.locateCenterOnScreen('default.png')
pyautogui.click(x, y)
print (x, y)
time.sleep(0.5)
except ImageNotFoundException:
print ("Nope nothing there. Try number:", tries)
time.sleep(1)
except KeyboardInterrupt:
print("Manual shutdown activated...")
time.sleep(1)
break;
Я знаю, я выбрал его, но он все равно выдает ошибку прерывания клавиатуры, а не печатает мои слова.
Должен ли быть цикл вокруг этого кода? Невозможно иметь break
без петли. И почему у тебя после этого стоит ;
?
Забыл добавить в этот пост часть цикла. Что означает SIGINT?
SIGINT
так работает ОС. сообщает приложению, что было нажато прерывание клавиатуры. Однако Python позаботится о выборе ОС. SigInt и переведите его в исключение KeyboardInterrupt, которое должно работать так, как вы (но проверьте мое предложение в ответе) - для других языков, возможно, придется зарегистрировать обработчик прерывания ОС с нуля, и это, вероятно, то, что @StasSimonov думал, что в Python это тоже нужно: нет.
Но на тот случай, если у вас не работает KeyboardInterrupt, вы можете попытаться обработать SigInt явно — проверьте документацию в документации signal
stdlib — docs.python.org/3/library/signal.html и установите обработчик. это переопределит код Python, который генерирует исключение KeyboardInterrupt.
KeyboardInterrupt
будет зафиксирован в этом коде только в том случае, если это произойдет во время выполнения кода внутри блока try:
— это весьма вероятно в представленном здесь фрагменте, поскольку весь код — это перезапуск этого блока.
Однако while true
в стиле псевдокода (рабочий код будет while True:
) предполагает, что это всего лишь попытка минимального воспроизводимого примера, который, вероятно, не воспроизводит ваш фактический код точно.
С учетом вышесказанного, создайте блок try/except KeyboardInterrupt
вокруг вашего (настоящего) while True:
блока, а не внутри него — вероятно, именно это там и происходит не так.
Я новичок в Python, что означает ваше настоящее время True?
Просто цикл, который есть в вашем фактическом работающем коде - как этот, который вы только что ввели в качестве примера в вопросе, чтобы проиллюстрировать, что цикл существует.
Подождите @jsbueno Во время ошибки ImageNotFoundException возникла ошибка, в этом проблема?
Вот полный пример того, что у вас есть, с некоторыми преувеличениями времени:
import time
while True:
print('outside try')
time.sleep(1) # interrupting here won't be caught
try:
print('inside try') # interrupting here will be caught (small window)
with open('nonexistent.file') as f: # This will go to FileNotFoundError
pass
except FileNotFoundError:
print('file not found')
time.sleep(.5) # interrupting here won't be caught
except KeyboardInterrupt:
break
print('outside try')
time.sleep(1) # interrupting here won't be caught
print('exiting')
Оберните именно те области, которые вы ожидаете поймать. Поместите KeyboardInterrupt
try на весь цикл while, а FileNotFoundError
попробуйте на открытие файла:
try:
while True:
try:
with open('nonexistent.file') as f:
pass
except FileNotFoundError:
print('file not found')
except KeyboardInterrupt:
print('exiting')
Возможно, это очевидно, но на всякий случай это то, чего вам не хватает: KeyboardInterrupt сработает, если вы нажмете Ctrl + C на терминале, который управляет вашим приложением, а не в том случае, если сфокусированное настольное приложение является чем-то еще.