Eu tenho um script python que usa threads e faz muitas solicitações HTTP. Acho que o que está acontecendo é que, enquanto uma solicitação HTTP (usando urllib2) está sendo lida, está bloqueando e não está respondendo CtrlCpara interromper o programa. Existe alguma maneira de contornar isso?
128
Respostas:
No Windows, a única maneira certa é usar CtrlBreak. Pára todos os scripts python instantaneamente!
(Observe que em alguns teclados, "Interromper" é rotulado como "Pausar".)
fonte
Break
? Como digito?Pressionar Ctrl+ cenquanto um programa python estiver em execução fará com que o python crie uma
KeyboardInterrupt
exceção. É provável que um programa que faça muitas solicitações HTTP tenha muitos códigos de manipulação de exceções. Se aexcept
parte do blocotry
-except
não especificar quais exceções ele deve capturar, ele captura todas as exceções, incluindo aKeyboardInterrupt
que você acabou de causar. Um programa python corretamente codificado fará uso da hierarquia de exceções python e somente capturará exceções derivadasException
.Se você não puder alterar o código (ou precisar interromper o programa para que suas alterações entrem em vigor), tente pressionar Ctrl+ crapidamente. A primeira das
KeyboardInterrupt
exceções eliminará seu programa dotry
bloco e, esperançosamente, uma dasKeyboardInterrupt
exceções posteriores será gerada quando o programa estiver fora de umtry
bloco.fonte
Se estiver em execução no shell do Python, use Ctrl+ Z; caso contrário, localize o
python
processo e mate-o.fonte
^Z
->[1]+ Stopped
->kill %1
a parada trabalho # 1 (ou trabalho% 1 como puts bater-lo)fg
o trará de volta.Ctrl+Z
não é a maneira correta de interromper um script python e deve ser evitado, a menos que você planeje retomar o processo pausado.O processo de interrupção depende do hardware e do sistema operacional. Portanto, você terá um comportamento muito diferente, dependendo de onde você executa seu script python. Por exemplo, em máquinas Windows, temos Ctrl+ C(
SIGINT
) e Ctrl+ Break(SIGBREAK
).Portanto, enquanto o SIGINT está presente em todos os sistemas e pode ser manipulado e capturado, o sinal SIGBREAK é específico do Windows (e pode ser desativado no CONFIG.SYS ) e é realmente tratado pelo BIOS como um vetor de interrupção INT 1Bh , e é por isso que essa chave é muito mais poderoso que qualquer outro. Portanto, se você estiver usando algum SO com sabor * nix, obterá resultados diferentes dependendo da implementação, pois esse sinal não está presente lá, mas outros estão. No Linux, você pode verificar quais sinais estão disponíveis para você:
Portanto, se você deseja capturar o
CTRL+BREAK
sinal em um sistema Linux, terá que verificar para qual sinal POSIX eles mapearam essa chave. Os mapeamentos populares são:De fato, muitas outras funções estão disponíveis no Linux, onde a chave SysRq(System Request) pode ganhar vida própria ...
fonte
Este post é antiga, mas Recentemente, correu para o mesmo problema de Ctrl+ Cnão terminar scripts Python no Linux. Eu usei Ctrl+ \(
SIGQUIT
).fonte
Ctrl+ DDiferença para Windows e Linux
Acontece que, a partir do Python 3.6, o interpretador Python manipula Ctrl+ de maneira Cdiferente para Linux e Windows. Para Linux, Ctrl+ Ciria funcionar principalmente como esperado no entanto no Windows Ctrl+ C maioria não funciona, especialmente se Python está a executar o bloqueio de chamadas, tais como
thread.join
ou à espera de resposta web. Notime.sleep
entanto, ele funciona . Aqui está uma boa explicação do que está acontecendo no interpretador Python. Observe que Ctrl+ CgeraSIGINT
.Solução 1: use Ctrl+ Breakou equivalente
Use os atalhos de teclado abaixo na janela do terminal / console, que serão gerados
SIGBREAK
em um nível inferior no SO e encerrarão o interpretador Python.Mac OS e Linux
Ctrl+ Shift+ \ou Ctrl+\
Windows :
Solução 2: use a API do Windows
Abaixo estão as funções úteis que detectam o Windows e instalam o manipulador personalizado para Ctrl+ Cno console:
Você pode usar acima desta forma:
Solução 3: Método de votação
Não prefiro ou recomendo esse método, pois consome desnecessariamente o processador e a energia, afetando negativamente o desempenho.
tempo de importação da segmentação de importação
fonte
ctrl + c
não fecha, mas mostraKeyboardInterrupt
.No Mac, pressione Ctrl+ \para sair de um processo python conectado a um terminal.
fonte
Em um terminal Mac / in:
fonte
Aqueles podem ajudar.
fonte
Você pode abrir o gerenciador de tarefas (ctrl + alt + delete e, em seguida, acessar o gerenciador de tarefas) e procurar por python e o servidor é chamado (por exemplo) _go_app (a convenção de nomenclatura é: _language_app).
Se eu encerrar a tarefa _go_app, o servidor será encerrado; portanto, o navegador dirá "encerrado inesperadamente", também uso o git bash e, quando inicio um servidor, não consigo sair do servidor no shell do bash com ctrl + c ou ctrl + pause, mas quando você terminar a tarefa python (a que usa 63,7 mb), ela quebrará o script do servidor no bash e permitirá que eu use o shell do git bash.
fonte
Para constar, o que matou o processo no meu Raspberry 3B + (executando o raspbian) foi o Ctrl+ '. No meu teclado francês AZERTY, o toque 'também é o número 4.
fonte