Как передать Ctrl + C в скрипт, вызываемый из пакетного задания

470
Mad Physicist

Я пытаюсь избежать последствий нажатия Ctrl+Cна пакетный файл, что-то похожее на Как подавить подтверждение «Завершить пакетное задание (Y / N)»? , Однако в моем случае я хочу, чтобы сигнал обрабатывался моим базовым сценарием. Мой командный файл выглядит так:

@ECHO off setlocal set "script_path=%~dp0" set "script_path=%script_path%myscript.py" python "%script_path%" %* endlocal 

Я хотел бы иметь возможность нажать Ctrl + C и обработать его как KeyboardInterruptошибку myscript.pyвместо немедленного прекращения процесса. Прямо сейчас, если я нажму Ctrl+C, я получу:

forrtl: error (200): program aborting due to control-C event Image PC Routine Line Source libifcoremd.dll 0FCA7CB8 Unknown Unknown Unknown KERNELBASE.dll 76411C99 Unknown Unknown Unknown KERNEL32.DLL 74A68484 Unknown Unknown Unknown ntdll.dll 77C2305A Unknown Unknown Unknown ntdll.dll 77C2302A Unknown Unknown Unknown Terminate batch job (Y/N)? 

Я пробовал следующие варианты:

  1. Заменить python "%script_path%" %*на start python "%script_path%" %*. Это запускает новую оболочку, которая на самом деле хороша тем, что я пытаюсь сделать. Стандартный ввод, кажется, работает правильно в новой оболочке. Однако Ctrl+Cимеет тот же эффект, что и раньше, и новая оболочка умирает сразу. Добавление exitкоманды в конец пакетного файла, похоже, также не имеет никакого эффекта.
  2. Заменить python "%script_path%" %*на start /b python "%script_path%" %*. Это просто запускает работу в фоновом режиме в той же оболочке. Ctrl+Cвсе еще просто убивает работу, и теперь стандартный ввод, кажется, не работает правильно.

Дополнительное примечание:

Мой скрипт Python должен время от времени читать пользовательский ввод sys.stdin. Сценарий читает некоторые входные данные, а затем обрабатывает их так, чтобы пользователь мог нажать Ctrl+C. Идея состоит в том, чтобы сделать что-то значимое в except KeyboardInterrupt:предложении, а не просто смотреть, как сценарий умирает.

1

1 ответ на вопрос

0
Viktor Nonov

Ctrl- Cэто, SIGINTтак что вы можете поймать его с помощью signalмодуля внутри вы питон скрипт:

import signal import time  def handler(signum, frame): print 'Got Ctrl-C' #you code handling the Ctrl-C  signal.signal(signal.SIGINT, handler) # your code 

Имейте в виду, что в Python 2.7 для Windows была ошибка, помеченная как Won't fix, поэтому вы должны использовать Python 3.3+.

К счастью, я использую 3.6. Проверим это и приму, если это работает. Mad Physicist 6 лет назад 0