take - sysargv python




Terminando um script Python (7)

Estou ciente do comando die() no PHP, que interrompe um script antecipadamente.

Como posso fazer isso em Python?


Acabei de descobrir que, ao escrever um aplicativo multithread, raise SystemExit e sys.exit() mata apenas o thread em execução. Por outro lado, os._exit() sai de todo o processo. Isso foi discutido here.

O exemplo abaixo tem 2 threads. Kenny e Cartman. Cartman deve viver para sempre, mas Kenny é chamado recursivamente e deve morrer depois de 3 segundos. (chamada recursiva não é o melhor caminho, mas eu tinha outros motivos)

Se também quisermos que Cartman morra quando Kenny morrer, Kenny deve ir embora com os._exit , senão, só Kenny morrerá e Cartman viverá para sempre.

import threading
import time
import sys
import os

def kenny(num=0):
    if num > 3:
        # print("Kenny dies now...")
        # raise SystemExit #Kenny will die, but Cartman will live forever
        # sys.exit(1) #Same as above

        print("Kenny dies and also kills Cartman!")
        os._exit(1)
    while True:
        print("Kenny lives: {0}".format(num))
        time.sleep(1)
        num += 1
        kenny(num)

def cartman():
    i = 0
    while True:
        print("Cartman lives: {0}".format(i))
        i += 1
        time.sleep(1)

if __name__ == '__main__':
    daemon_kenny = threading.Thread(name='kenny', target=kenny)
    daemon_cartman = threading.Thread(name='cartman', target=cartman)
    daemon_kenny.setDaemon(True)
    daemon_cartman.setDaemon(True)

    daemon_kenny.start()
    daemon_cartman.start()
    daemon_kenny.join()
    daemon_cartman.join()

Enquanto você geralmente deve preferir sys.exit porque é mais "amigável" para outro código, tudo o que realmente faz é levantar uma exceção.

Se você tem certeza que precisa sair de um processo imediatamente, e pode estar dentro de algum manipulador de exceções que detectaria o SystemExit , existe outra função - os._exit - que termina imediatamente no nível C e não executa nenhuma das funções. desmontagem normal do intérprete; por exemplo, ganchos registrados com o módulo "atexit" não são executados.


No Python 3.5, eu tentei incorporar código semelhante sem o uso de módulos (por exemplo, sys, Biopy) além do que está embutido para parar o script e imprimir uma mensagem de erro para os meus usuários. Aqui está o meu exemplo:

## My example:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    print("Start codon is missing! Check your DNA sequence!");
    exit(); ## as most folks said above

Mais tarde, descobri que é mais sucinto apenas lançar um erro:

## My example revised:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    raise ValueError("Start codon is missing! Check your DNA sequence!");

Outra maneira é:

raise SystemExit

Você também pode usar simplesmente exit() .

Tenha em mente que sys.exit() , exit() , quit() e os._exit(0) eliminam o interpretador Python. Portanto, se aparecer em um script chamado de outro script por execfile() , ele interrompe a execução de ambos os scripts.

Consulte " Parar a execução de um script chamado com execfile " para evitar isso.


tente usar break após um loop, em seguida, use quit () ou exit ().


import sys
sys.exit()

detalhes da documentação do módulo sys :

sys. exit ([ arg ])

Saia do Python. Isso é implementado ao levantar a exceção SystemExit , portanto, as ações de limpeza especificadas por cláusulas finally de instruções try são respeitadas e é possível interceptar a tentativa de saída em um nível externo.

O arg argumento opcional pode ser um inteiro dando o status de saída (padrão para zero), ou outro tipo de objeto. Se for um inteiro, zero é considerado “terminação bem-sucedida” e qualquer valor diferente de zero é considerado “finalização anormal” por shells e similares. A maioria dos sistemas exige que ele esteja no intervalo de 0 a 127 e produza resultados indefinidos de outra forma. Alguns sistemas têm uma convenção para atribuir significados específicos a códigos de saída específicos, mas geralmente são subdesenvolvidos; Programas Unix geralmente usam 2 para erros de sintaxe de linha de comando e 1 para todos os outros tipos de erros. Se outro tipo de objeto for passado, Nenhum é equivalente a passar zero, e qualquer outro objeto é impresso para stderr e resulta em um código de saída 1. Em particular, sys.exit("some error message") é uma maneira rápida de sair de um programa quando ocorrer um erro.

Uma vez que exit() finalmente “apenas” gera uma exceção, ele só sairá do processo quando chamado do thread principal, e a exceção não será interceptada.

Note que esta é a maneira "boa" de sair. @ glyphtwistedmatrix abaixo indica que se você quiser uma 'hard exit', você pode usar os._exit (errorcode), embora seja provável que seja específico de algum modo (pode não ser necessário um código de erro no windows, por exemplo), e definitivamente é menos amigável, pois não permite que o intérprete faça qualquer limpeza antes que o processo morra.





termination