it-swarm-pt.tech

Terminando um script Python

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

Como posso fazer isso em Python?

867
Teifion
import sys
sys.exit()

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

sys.exit([arg])

Saia do Python. Isto é implementado levantando o SystemExit exception, então as ações de limpeza especificadas por cláusulas finally de try statements são honradas, e é possível interceptar a tentativa de saída em um nível externo.

O argumento opcional arg pode ser um inteiro dando o status de saída (padrão zero), ou outro tipo de objeto. Se for um número 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, None é equivalente a zero, e qualquer outro objeto é impresso em 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 um ocorreu um erro.

Como exit() finalmente “only” 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 a seguir ressalta que se você quiser uma 'saída difícil', você pode usar os._exit ( errorcode ), embora seja provável que seja específico em algum ponto (pode não ser necessário errorcode sob windows, por exemplo), e definitivamente é menos amigável, pois não permite que o interpretador faça qualquer limpeza antes que o processo morra.

1180
pjz

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

Exemplo:

#do stuff
if this == that:
  quit()
258
j.m.g.r

Outra maneira é:

raise SystemExit
107
Vhaerun

Enquanto você geralmente deve preferir sys.exit porque é mais "amigável" para outro código, tudo o que realmente 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 detectaria SystemExit, há outra função - os._exit - que termina imediatamente no nível C e não executa nenhum rasgo normal. -down do intérprete; por exemplo, ganchos registrados com o módulo "atexit" não são executados.

62
Glyph

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

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

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

58
Space cowboy
from sys import exit
exit()

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

24
cleg

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

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, caso contrário, 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 __== '__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()
21
eaydin

Eu sou um novato total, mas certamente isso é mais limpo e mais controlado

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

if __== '__main__': 
    main()

...

Programa terminado

do que

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

if __== '__main__': 
    main()

...

Traceback terminado pelo programa (última chamada mais recente): Arquivo "Z:\Directory\testdieprogram.py", linha 12, em main () Arquivo "Z:\Directory\testdieprogram.py", linha 8, em main sys.exit ( ) SystemExit

Editar

O ponto é que o programa termina suave e pacificamente, ao invés de "I'VE STOPPED !!!!"

15
Floggedhorse

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!");
6
David C.