Pergunta

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

Como posso fazer isso em Python?

Foi útil?

Solução

import sys
sys.exit()

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

sys.saída([argumento])

Saia do Python.Isto é implementado através do aumento do SystemExit exceção, portanto, ações de limpeza especificadas por cláusulas finais de try As declarações são honradas, e é possível interceptar o tentativa de saída em um nível externo.

O argumento opcional argumento pode ser um inteiro que dá o status de saída (padrão para zero) ou outro tipo de objeto.Se for um número inteiro, zero é considerado "término bem-sucedido" e qualquer valor diferente de zero é considerado "terminação anormal" por conchas e afins.A maioria dos sistemas exigem que ele esteja na faixa de 0 a 127 e produzam resultados indefinidos caso contrário.Alguns sistemas têm uma convenção para atribuir significados para códigos de saída específicos, mas estes são geralmente subdesenvolvido;Programas Unix geralmente usam 2 para sintaxe de linha de comando erros e 1 para todos os outros tipos de erros.Se outro tipo de objeto é 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 Ocorre um erro.

Desde exit() Por fim, "apenas" levanta uma exceção, ele só sairá do processo quando chamado do thread principal e a exceção não é interceptada.

Observe que esta é a maneira 'legal' de sair.@matriz torcida de glifo abaixo indica que se você deseja uma 'saída forçada', você pode usar os._exit(Erro de código), embora seja provavelmente específico do sistema operacional até certo ponto (pode não receber um código de erro no Windows, por exemplo), e definitivamente é menos amigável, pois não permite que o intérprete faça nenhuma limpeza antes que o processo termine.

Outras dicas

Uma maneira simples de encerrar um script Python antecipadamente é usar a função integrada quit().Não há necessidade de importar nenhuma biblioteca e é eficiente e simples.

Exemplo:

#do stuff
if this == that:
  quit()

Outra maneira é:

raise SystemExit

Embora você geralmente deva preferir sys.exit por ser mais "amigável" com outros códigos, tudo o que ele faz é gerar uma exceção.

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

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

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

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

from sys import exit
exit()

Como parâmetro você pode passar um código de saída, que será retornado ao SO.O padrão é 0.

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

O exemplo abaixo possui 2 threads.Kenny e Cartman.Supõe-se que Cartman viva para sempre, mas Kenny é chamado recursivamente e deve morrer após 3 segundos.(chamada recursiva não é a melhor maneira, mas tive outros motivos)

Se também quisermos que Cartman morra quando Kenny morrer, Kenny deveria ir embora com os._exit, caso contrário, apenas 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()

Sou totalmente novato, mas certamente isso é mais limpo e controlado

def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        return
    print 'You wont see this'

if __name__ == '__main__': 
    main()

...

Programa encerrado

que

import sys
def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        sys.exit()
    print 'You wont see this'

if __name__ == '__main__': 
    main()

...

Programa encerrado Traceback (última chamada mais recente):Arquivo "Z:\Directory estdieprogram.py", linha 12, em main() Arquivo "Z:\Directory estdieprogram.py", linha 8, na principal sys.exit() SystemExit

Editar

A questão é que o programa termine de forma suave e pacífica, em vez de "PAREI!!!!"

No Python 3.5, tentei incorporar código semelhante sem o uso de módulos (por exemplosys, Biopy) além do que está integrado para interromper o script e imprimir uma mensagem de erro para meus usuários.Aqui está 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 gerar um erro:

## My example revised:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    raise ValueError("Start codon is missing! Check your DNA sequence!");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top