Parando o python usando ctrl + c


128

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?


9
Não sei por que, mas pelo menos no OS X, usar Control + Backslash faz com que ele termine e você obtém uma caixa de diálogo "python crashed" ... estranha. Não é realmente essa informação útil, portanto, é um comentário!
micmoo

3
Na verdade, ele funciona em todos os aplicativos no Terminal ...
micmoo

1
David Beazley descreveu como uma interrupção Ctrl / C pode transformar um script Python com vários threads em um porco da CPU. É tocado aqui ( stackoverflow.com/questions/990102/… ) com um link para a palestra de Beazley.
Ned Deily

Respostas:


189

No Windows, a única maneira certa é usar CtrlBreak. Pára todos os scripts python instantaneamente!

(Observe que em alguns teclados, "Interromper" é rotulado como "Pausar".)


4
O que é Break? Como digito?
U0b34a0f6ae 1/09/09

5
Deveria haver um botão Pause_Break no seu teclado
jonatron 01/09/09

18
E se não houver? Estou em um Macbook Intel e ele não possui um teclado com todos os recursos.
Bluu

53
No Linux, você deve usar Ctrl-Shift- \
Michał Zieliński

12
ctrl + Z não mata o script, apenas o oculta em segundo plano e o suspende. Você pode digitar fg para recuperá-lo.
Shady Xu

84

Pressionar Ctrl+ cenquanto um programa python estiver em execução fará com que o python crie uma KeyboardInterruptexceção. É provável que um programa que faça muitas solicitações HTTP tenha muitos códigos de manipulação de exceções. Se a exceptparte do bloco try- exceptnão especificar quais exceções ele deve capturar, ele captura todas as exceções, incluindo a KeyboardInterruptque você acabou de causar. Um programa python corretamente codificado fará uso da hierarquia de exceções python e somente capturará exceções derivadas 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

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 KeyboardInterruptexceções eliminará seu programa do trybloco e, esperançosamente, uma das KeyboardInterruptexceções posteriores será gerada quando o programa estiver fora de um trybloco.


1
Essa é uma ótima resposta para ativar a "interrupção" mais comum, que é ctrl + c.
Xerion

53

Se estiver em execução no shell do Python, use Ctrl+ Z; caso contrário, localize o pythonprocesso e mate-o.


25
^Z-> [1]+ Stopped -> kill %1a parada trabalho # 1 (ou trabalho% 1 como puts bater-lo)
u0b34a0f6ae

23
Vale a pena acrescentar à resposta que Ctrl + Z apenas pausa o processo.
Matteo Italia

2
Para elaborar o exposto acima: Pausar o processo mantém-o na memória e no shell, apenas impede o uso de recursos da CPU. Arquivos, soquetes, tudo ainda está aberto e em uso. De fato, digitar fgo trará de volta.
RandomInsano

2
Ctrl+Znão é a maneira correta de interromper um script python e deve ser evitado, a menos que você planeje retomar o processo pausado.
Josh Correia

33

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ê:

$ 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

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:

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

De fato, muitas outras funções estão disponíveis no Linux, onde a chave SysRq(System Request) pode ganhar vida própria ...


19

Este post é antiga, mas Recentemente, correu para o mesmo problema de Ctrl+ Cnão terminar scripts Python no Linux. Eu usei Ctrl+ \( SIGQUIT).


Embora ele irá causar um dump de memória, mas que pára o script, graças
ospider

17

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.joinou à espera de resposta web. No time.sleepentanto, ele funciona . Aqui está uma boa explicação do que está acontecendo no interpretador Python. Observe que Ctrl+ Cgera SIGINT.

Solução 1: use Ctrl+ Breakou equivalente

Use os atalhos de teclado abaixo na janela do terminal / console, que serão gerados SIGBREAKem um nível inferior no SO e encerrarão o interpretador Python.

Mac OS e Linux

Ctrl+ Shift+ \ou Ctrl+\

Windows :

  • Geral: Ctrl+Break
  • Dell: Ctrl+ Fn+ F6ou Ctrl+ Fn+S
  • Lenovo: Ctrl+ Fn+ F11ou Ctrl+ Fn+B
  • HP: Ctrl+ Fn+Shift
  • Samsung: Fn+Esc

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:

#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)

Você pode usar acima desta forma:

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!

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

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

Não, no Ubuntu, para python 2.7 e 3.6, pressionar ctrl + cnão fecha, mas mostra KeyboardInterrupt.
Rick

7

No Mac, pressione Ctrl+ \para sair de um processo python conectado a um terminal.


3

Em um terminal Mac / in:

  1. Show Inspector (clique com o botão direito na janela do terminal ou Shell> Show Inspector)
  2. clique no ícone Configurações acima de "processos em execução"
  3. escolha na lista de opções em "Signal Process Group" (matar, encerrar, interromper, etc.).

1
  • Forçar o fechamento do programa usando Alt + F4 (desliga o programa atual)
  • Spam no botão X no CMD para ex
  • Gerenciador de tarefas (primeiro Windows + R e depois "taskmgr") e depois encerre a tarefa.

Aqueles podem ajudar.


1

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. insira a descrição da imagem aqui


1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.