У меня есть python script, который использует потоки и делает много HTTP-запросов. Я думаю, что происходит, когда читается HTTP-запрос (используя urllib2), он блокирует и не отвечает на Ctrl C, чтобы остановить программу. Есть ли способ обойти это?
Остановка python с помощью 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.
Ответ 12
ctrl + q мгновенно остановит текущий код и закроет все окна.