У меня есть скрипт на Python, который использует потоки и выполняет множество HTTP-запросов. Я думаю, что происходит то, что пока HTTP-запрос (с использованием urllib2) читает, он блокируется и не отвечает, CtrlCчтобы остановить программу. Есть ли способ обойти это?
128
Ответы:
В Windows единственный верный способ - использовать CtrlBreak. Мгновенно останавливает каждый скрипт Python!
(Обратите внимание, что на некоторых клавиатурах «Перерыв» помечен как «Пауза».)
источник
Break
? Как мне это набрать?Нажатие Ctrl+ cво время работы программы python приведет к тому, что python вызовет
KeyboardInterrupt
исключение. Вероятно, что программа, которая выполняет множество HTTP-запросов, будет иметь много кода обработки исключений. Еслиexcept
частьtry
-except
блок не определяет , какие исключения он должен поймать, он будет перехватывать все исключения , в том числе ,KeyboardInterrupt
что вы только что вызвали. Правильно написанная программа на Python будет использовать иерархию исключений Python и улавливать только исключения, производные отException
.Если вы не можете изменить код (или вам нужно убить программу, чтобы ваши изменения вступили в силу), вы можете попробовать быстро нажать Ctrl+ c. Первое из
KeyboardInterrupt
исключений выбьет вашу программу изtry
блока, и, надеюсь, одно из последующихKeyboardInterrupt
исключений будет вызвано, когда программа находится внеtry
блока.источник
Если он запущен в оболочке Python, используйте Ctrl+ Z, в противном случае найдите
python
процесс и завершите его.источник
^Z
->[1]+ Stopped
->kill %1
чтобы остановить задание №1 (или задание% 1, как выразился bash)fg
вернет его обратно.Ctrl+Z
- неправильный способ остановить скрипт Python, и его следует избегать, если вы не планируете возобновлять приостановленный процесс.Процесс прерывания зависит от оборудования и ОС. Таким образом, у вас будет очень разное поведение в зависимости от того, где вы запускаете свой скрипт python. Например, на компьютерах с Windows у нас есть Ctrl+ C(
SIGINT
) и Ctrl+ Break(SIGBREAK
).Таким образом, хотя SIGINT присутствует во всех системах и может быть обработан и перехвачен, сигнал SIGBREAK специфичен для Windows (и может быть отключен в CONFIG.SYS ) и действительно обрабатывается BIOS как вектор прерывания INT 1Bh , поэтому этот ключ намного мощнее любого другого. Так что, если вы используете какую-то ОС со вкусом * nix, вы получите разные результаты в зависимости от реализации, поскольку этого сигнала там нет, но есть другие. В Linux вы можете проверить, какие сигналы вам доступны:
Поэтому, если вы хотите поймать
CTRL+BREAK
сигнал в системе Linux, вам нужно будет проверить, с каким сигналом POSIX они сопоставили этот ключ. Популярные сопоставления:Фактически, в Linux доступно гораздо больше функций, где SysRqклавиша (System Request) может жить собственной жизнью ...
источник
Это старый пост, но я недавно столкнулся с той же проблемой: Ctrl+ Cне завершать скрипты Python в Linux. Я использовал Ctrl+ \(
SIGQUIT
).источник
Ctrl+ DРазница для Windows и Linux
Оказывается, что начиная с Python 3.6 интерпретатор Python работает Ctrl+ по- Cразному для Linux и Windows. Для Linux Ctrl+ Cбудет работать в основном так, как ожидалось, однако в Windows Ctrl+ в C основном не работает, особенно если Python выполняет блокирующий вызов, например
thread.join
или ожидает веб-ответа. Однако это работаетtime.sleep
. Вот красивое объяснение того, что происходит в интерпретаторе Python. Обратите внимание, что Ctrl+ CгенерируетSIGINT
.Решение 1. Используйте Ctrl+ Breakили эквивалент
Используйте приведенные ниже сочетания клавиш в окне терминала / консоли, которые будут генерироваться
SIGBREAK
на более низком уровне в ОС и завершать интерпретатор Python.Mac OS и Linux
Ctrl+ Shift+ \или Ctrl+\
Окна :
Решение 2. Используйте Windows API
Ниже приведены удобные функции, которые обнаруживают Windows и устанавливают собственный обработчик для Ctrl+ Cв консоли:
Вы можете использовать это так:
Решение 3. Метод опроса
Я не предпочитаю и не рекомендую этот метод, потому что он излишне потребляет процессор и мощность, что негативно сказывается на производительности.
импорт потоковой передачи время импорта
источник
ctrl + c
не прекращается, а отображаетсяKeyboardInterrupt
.На Mac нажмите Ctrl+, \чтобы выйти из процесса Python, подключенного к терминалу.
источник
На Mac / в Терминале:
источник
Это может помочь.
источник
Вы можете открыть свой диспетчер задач (ctrl + alt + delete, затем перейти к диспетчеру задач) и просмотреть его на наличие python, и сервер будет вызван (например) _go_app (соглашение об именах: _language_app).
Если я завершу задачу _go_app, это завершит работу сервера, поэтому при переходе к нему в браузере будет указано, что он "неожиданно завершился", я также использую git bash, и когда я запускаю сервер, я не могу выйти из сервера в оболочке bash с помощью ctrl + c или ctrl + pause, но как только вы завершите задачу python (та, которая использует 63,7 мб), она выйдет из сценария сервера в bash и позволит мне использовать оболочку git bash.
источник
Для справки, что убило процесс на моем Raspberry 3B + (работающем с raspbian), было Ctrl+ '. На моей французской клавиатуре AZERTY сенсор 'тоже номер 4.
источник