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

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

Ответ 1

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

(Обратите внимание, что на некоторых клавиатурах "Разрыв" обозначается как "Пауза".)

Ответ 2

Нажатие Ctrl + c во время работы программы на Python приведет к тому, что python вызовет исключение KeyboardInterrupt. Вполне вероятно, что программа, которая делает много HTTP-запросов, будет иметь много кода обработки исключений. Если except части try - за except блока не определяет, какие исключения он должен поймать, он будет перехватывать все исключения, в том числе KeyboardInterrupt, что вы только что вызвали. Правильно закодированная программа 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 KeyboardInterrupt

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

Ответ 3

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

Ответ 4

Процесс прерывания зависит от оборудования и ОС. Таким образом, у вас будет совсем другое поведение в зависимости от того, где вы запускаете свой python script. Например, на машинах Windows мы имеем Ctrl + C (SIGINT) и Ctrl + Break (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 signal в системе Linux, вам нужно будет проверить, что POSIX, они отобразили этот ключ. Популярные сопоставления:

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

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

Ответ 5

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

Ответ 6

Ctrl + C Разница для Windows и Linux

Оказывается, что в Python 3.6 интерпретатор по-разному обрабатывает SIGINT, сгенерированный Ctrl + C, для Linux и Windows. В Linux ctrl + c будет работать в основном так, как и ожидалось, однако в Windows ctrl + c в основном не работает, если блокировка вызова, например, thread.join или ожидание ответа в Интернете (однако, он работает для time.sleep, однако). Здесь хорошее объяснение того, что происходит в интерпретаторе Python.

Решение 1. Используйте Ctrl + Break или Эквивалент

Используйте ниже сочетания клавиш в окне терминала/консоли, которые будут генерировать SIGBREAK на более низком уровне в ОС и завершать интерпретатор Python.

Mac OS и Linux

Ctrl + Shift +\or Ctrl + \

Windows:

  • Общее: Ctrl+Break
  • Dell: Ctrl+Fn+F6 или Ctrl+Fn+S
  • Lenovo: Ctrl+Fn+F11 или Ctrl+Fn+B
  • HP: Ctrl+Fn+Shift
  • Samsung: Fn+Esc

Решение 2. Используйте Windows API

Ниже приведены удобные функции, которые обнаружат Windows и установят пользовательский обработчик для Ctrl + C в консоли:

#win_ctrl_c.py

import sys

def handler(a,b=None):
    sys.exit(1)
def install_handler():
    if sys.platform == "win32":
        import win32api
        win32api.SetConsoleCtrlHandler(handler, True)

Вы можете использовать выше, как это:

import threading
import time
import win_ctrl_c

# do something that will block
def work():
    time.sleep(10000)        
t = threading.Thread(target=work)
t.daemon = True
t.start()

#install handler
install_handler()

# now block
t.join()

#Ctrl+C works now!

Решение 3: Метод опроса

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

время импорта

def work():
    time.sleep(10000)        
t = threading.Thread(target=work)
t.daemon = True
t.start()
while(True):
    t.join(0.1) #100ms ~ typical human response
# you will get KeyboardIntrupt exception

Ответ 7

На прессе Mac:

"control" + "\"

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

Ответ 8

На mac/in Terminal:

  • Показать инспектор (щелкните правой кнопкой мыши в окне терминала или "Шелл" > "Показать инспектор" )
  • щелкните значок "Настройки" над "запущенными процессами"
  • выберите из списка опций в разделе "Группа обработки сигналов" (Убейте, завершите, прерывайте и т.д.).

Ответ 9

  • Принуждение программы к закрытию с помощью Alt + F4 (выключает текущую программу)
  • Спам кнопки X на CMD для ex
  • Taskmanager (сначала Windows + R, а затем "taskmgr"), а затем завершает задачу.

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

Ответ 10

Для справки, то, что убило процесс на моей Raspberry 3B+ (работает raspbian), было:

CTRL + ' 

На моей французской клавиатуре AZERTY тач тоже номер 4.

Ответ 11

Вы можете открыть свой диспетчер задач (ctrl + alt + delete, затем перейти к диспетчеру задач) и просмотреть его на python, и сервер называется (для примера) _go_app (соглашение об именах: _language_app).

Если я завершу задачу _go_app, то это завершит работу сервера, поэтому, зайдя туда в браузере, он скажет, что он "неожиданно завершился", я также использую git bash, и когда я запускаю сервер, я не могу выйти из сервера в оболочке bash. с помощью ctrl + c или ctrl + pause, но как только вы завершите задачу python (та, которая использует 63.7 mb), она выйдет из серверного скрипта в bash и позволит мне использовать оболочку git bash. enter image description here

Ответ 12

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