Как использовать KeyboardInterrupt с другими исключениями?

Я пытаюсь использовать 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;

Возможно, это очевидно, но на всякий случай это то, чего вам не хватает: KeyboardInterrupt сработает, если вы нажмете Ctrl + C на терминале, который управляет вашим приложением, а не в том случае, если сфокусированное настольное приложение является чем-то еще.

jsbueno 07.08.2024 18:37

Я знаю, я выбрал его, но он все равно выдает ошибку прерывания клавиатуры, а не печатает мои слова.

mmewtwosaysbye 07.08.2024 18:37

Должен ли быть цикл вокруг этого кода? Невозможно иметь break без петли. И почему у тебя после этого стоит ;?

Barmar 07.08.2024 18:40

Забыл добавить в этот пост часть цикла. Что означает SIGINT?

mmewtwosaysbye 07.08.2024 18:41
SIGINT так работает ОС. сообщает приложению, что было нажато прерывание клавиатуры. Однако Python позаботится о выборе ОС. SigInt и переведите его в исключение KeyboardInterrupt, которое должно работать так, как вы (но проверьте мое предложение в ответе) - для других языков, возможно, придется зарегистрировать обработчик прерывания ОС с нуля, и это, вероятно, то, что @StasSimonov думал, что в Python это тоже нужно: нет.
jsbueno 07.08.2024 19:02

Но на тот случай, если у вас не работает KeyboardInterrupt, вы можете попытаться обработать SigInt явно — проверьте документацию в документации signal stdlib — docs.python.org/3/library/signal.html и установите обработчик. это переопределит код Python, который генерирует исключение KeyboardInterrupt.

jsbueno 07.08.2024 19:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
6
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

KeyboardInterrupt будет зафиксирован в этом коде только в том случае, если это произойдет во время выполнения кода внутри блока try: — это весьма вероятно в представленном здесь фрагменте, поскольку весь код — это перезапуск этого блока.

Однако while true в стиле псевдокода (рабочий код будет while True:) предполагает, что это всего лишь попытка минимального воспроизводимого примера, который, вероятно, не воспроизводит ваш фактический код точно.

С учетом вышесказанного, создайте блок try/except KeyboardInterrupt вокруг вашего (настоящего) while True: блока, а не внутри него — вероятно, именно это там и происходит не так.

Я новичок в Python, что означает ваше настоящее время True?

mmewtwosaysbye 07.08.2024 19:03

Просто цикл, который есть в вашем фактическом работающем коде - как этот, который вы только что ввели в качестве примера в вопросе, чтобы проиллюстрировать, что цикл существует.

jsbueno 07.08.2024 19:08

Подождите @jsbueno Во время ошибки ImageNotFoundException возникла ошибка, в этом проблема?

mmewtwosaysbye 07.08.2024 19:15
Ответ принят как подходящий

Вот полный пример того, что у вас есть, с некоторыми преувеличениями времени:

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')

Другие вопросы по теме