Остановка python с помощью ctrl+c



У меня есть скрипт python, который использует потоки и делает много HTTP-запросов. Я думаю, что происходит то, что в то время как HTTP-запрос (используя urllib2) читает, он блокирует и не отвечает на CtrlC остановить программу. Есть ли способ обойти это?

272   9  

9 ответов:

в Windows, единственный верный способ-использовать Ctrlперерыв. Останавливает каждый скрипт python мгновенно!

(обратите внимание, что на некоторых клавиатурах, "перерыв" обозначено как "пауза".)

клавишей Ctrl + c в то время как программа python работает заставит python поднять KeyboardInterupt исключения. Вполне вероятно, что программа, которая делает много HTTP-запросов будет много кода обработки исключений. Если исключающая часть блока try-except не указывает, какие исключения он должен поймать, он будет ловить все исключения, включая KeyboardInterupt, который вы только что вызвали. Правильно закодированная программа python будет использовать элемент иерархия исключений python и только ловить исключения, которые являются производными от exception.

#This is the wrong way to do things
try:
  #Some stuff might raise an IO exception
except:
  #Code that ignores errors

#This is the right way to do things
try:
  #Some stuff might raise an IO exception
except Exception:
  #This won't catch KeyboardInterupt

Если вы не можете изменить код (или нужно убить программу, чтобы ваши изменения вступили в силу), то вы можете попробовать нажать Ctrl + c быстро. Первое из исключений KeyboardInterupt выбьет вашу программу из блока try и, надеюсь, одно из более поздних исключений KeyboardInterrupt будет вызвано, когда программа за пределами блока try.

если он работает в оболочке Python используйте Ctrl + Z, в противном случае найдите python процесс и убить его.

процесс прерывания зависит от оборудования и ОС. Таким образом, у вас будет очень разное поведение в зависимости от того, где вы запускаете свой скрипт python. Например, на машинах Windows у нас есть Ctrl+C (SIGINT) и Ctrl+перерыв (SIGBREAK).

таким образом, пока SIGINT присутствует на всех системах и может быть обработан и пойман, сигнал SIGBREAK является специфичным для Windows (и может быть отключен в CONFIG.SYS) и действительно обрабатывается BIOS как вектор прерывания INT 1Bh, именно поэтому этот ключ гораздо более мощный, чем любой другой. Поэтому, если вы используете некоторые *Nix ароматизированные ОС, вы получите разные результаты в зависимости от реализации, так как этот сигнал там отсутствует, но другие есть. В Linux вы можете проверить, какие сигналы доступны вам:

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGEMT       8) SIGFPE       9) SIGKILL     10) SIGBUS
11) SIGSEGV     12) SIGSYS      13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGURG      17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGPWR      30) SIGUSR1
31) SIGUSR2     32) SIGRTMAX

так что если вы хотите поймать CTRL+BREAKсигнал в системе linux вам нужно будет проверить, к чему сигнал POSIX они нанесли этот ключ на карту. Популярные сопоставления:

CTRL+\     = SIGQUIT 
CTRL+D     = SIGQUIT
CTRL+C     = SIGINT
CTRL+Z     = SIGTSTOP 
CTRL+BREAK = SIGKILL or SIGTERM or SIGSTOP

в самом деле, многие другие функции доступны под Linux, где SysRq (системный запрос) ключ может взять на себя собственная жизнь...

этот пост старый, но я недавно столкнулся с той же проблемой CTRL+C не завершая скрипты python на моем Linux. Я использовал CTRL + \ (SIGQUIT).

на Mac нажмите:

"управление" + " \ "

чтобы выйти из процесса python, подключенного к терминалу.

на терминале mac / in:

  1. показать инспектор (щелкните правой кнопкой мыши в окне терминала или оболочки >показать инспектор)
  2. нажмите на значок настроек выше "запущенные процессы"
  3. выберите из списка опций в разделе "Группа обработки сигнала" (Kill, terminate, interrupt и т. д.).
  • принудительное закрытие программы с помощью Alt+F4 (выключает текущую программу)
  • спам кнопку X на CMD для e. x.
  • Taskmanager (сначала Windows+R, а затем "taskmgr"), а затем завершить задачу.

это может помочь.

ctrl+q мгновенно остановит запущенный код и закроет все окна.

Comments

    Ничего не найдено.