it-swarm-tr.com

Bir Python betiğini sonlandırma

Bir betiği erken durduran PHP içindeki die() komutunun farkındayım.

Bunu Python'da nasıl yapabilirim?

867
Teifion
import sys
sys.exit()

sys modülü belgelerine ait detaylar :

sys.exit([arg])

Python'dan çıkın. Bu, SystemExit istisna yükseltilerek gerçekleştirilir, bu nedenle try / ifadelerinin nihayetinde belirtilen temizleme eylemleri onurlandırılır ve çıkış denemesini dış bir seviyede tutmak mümkündür.

İsteğe bağlı argüman arg çıkış durumunu veren bir tam sayı (varsayılan sıfıra) veya başka bir nesne olabilir. Bir tamsayıysa, sıfır “başarılı sonlandırma” olarak kabul edilir ve sıfır olmayan herhangi bir değer, kabukları ve benzerleri tarafından “anormal sonlandırma” olarak kabul edilir. Çoğu sistem, 0-127 aralığında olmasını gerektirir ve aksi takdirde tanımsız sonuçlar üretir. Bazı sistemler, belirli çıkış kodlarına belirli anlamlar atamak için bir sözleşmeye sahiptir, ancak bunlar genellikle az gelişmişlerdir; Unix programları genellikle komut satırı sözdizimi hataları için 2 ve diğer tüm hatalar için 1 kullanır. Başka türden bir nesne iletilirse, Yok, sıfıra geçmekle eşdeğerdir ve başka herhangi bir nesne stderr ile yazdırılır ve sonuçta 1 çıkış koduyla sonuçlanır. Özellikle, sys.exit("some error message") bir programdan çıkarken hızlı bir yoldur. Hata oluştu.

exit() / nihayetinde “sadece” bir istisna yarattığından, sadece ana iş parçacığından çağrıldığında süreçten çıkar ve istisna ele geçirilmez.

Bu çıkış için 'güzel' bir yol olduğunu unutmayın. @ glyphtwistedmatrix below, 'zor bir çıkış' istiyorsanız, os._exit ( errorcode ) 'ı kullanabileceğinizi belirtir, ancak bir dereceye kadar os-spesifik olabilir (bir örneğin, pencerelerdeki hata kodu) ve tercümanın işlem bitmeden önce herhangi bir temizlik yapmasına izin vermediğinden kesinlikle daha az kolaydır.

1180
pjz

Bir Python betiğini erken sonlandırmanın basit bir yolu, yerleşik quit () işlevini kullanmaktır. Herhangi bir kütüphaneyi içe aktarmaya gerek yoktur ve verimli ve basittir.

Örnek:

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

Başka bir yol:

raise SystemExit
107
Vhaerun

Genelde sys.exit tercih etmelisiniz, çünkü diğer koda göre daha "dost" olur, aslında tek yaptığı bir istisna oluşturmaktır.

Bir işlemden hemen çıkmanız gerektiğinden eminseniz ve SystemExit işlevini yakalayabilecek bir istisna eylemcisinin içinde olabilirseniz, C düzeyinde hemen sonlanan ve normal yırtılmayı gerçekleştirmeyen başka bir işlev vardır - os._exit - tercümanın aşılması; örneğin, "atexit" modülüne kayıtlı kancalar kullanılmaz.

62
Glyph

Ayrıca, exit() işlevini de kullanabilirsiniz.

sys.exit(), exit(), quit() ve os._exit(0) kill Python yorumlayıcısının olduğunu unutmayın. Bu nedenle, execfile() tarafından başka bir komut dosyasından çağrılan bir komut dosyasında görünüyorsa, her iki komut dosyasının yürütülmesini de durdurur.

Bundan kaçınmak için " execfile " adlı bir betiğin çalışmasını durdurun.

58
Space cowboy
from sys import exit
exit()

Parametre olarak, işletim sistemine döndürülecek bir çıkış kodu iletebilirsiniz. Varsayılan 0'dır.

24
cleg

Sadece okuyuculu bir uygulama yazarken, raise SystemExit ve sys.exit() öğelerinin yalnızca çalışan iş parçacığını öldürdüğünü öğrendim. Öte yandan, os._exit() tüm işlemden çıkar. Bu tartışıldı burada.

Aşağıdaki örnekte 2 konu vardır. Kenny ve Cartman. Cartman'ın sonsuza dek yaşaması bekleniyor, ama Kenny tekrarlı olarak çağrılıyor ve 3 saniye sonra ölmesi gerekiyor. (özyinelemeli arama en iyi yol değil, ancak başka nedenlerim vardı)

Eğer Cartman'ın Kenny öldüğü zaman ölmesini istiyorsak, Kenny os._exit ile uzaklaşmalı, yoksa sadece Kenny ölecek ve sonsuza kadar Cartman yaşayacak.

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

Ben bir acemi değilim ama kesinlikle bu daha temiz ve daha kontrollü

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

if __== '__main__': 
    main()

...

Program sonlandırıldı

göre

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

if __== '__main__': 
    main()

...

Program sonlandırıldı Geri izleme (en son arama son): Dosya "Z:\Directory\testdieprogram.py", satır 12, ana () Dosya "Z:\Directory\testdieprogram.py", satır 8, ana sys.exit ( ) SystemExit

Düzenle

Programın sorunsuz ve barışçıl bir şekilde sona erdiği, "DURDURULUM !!!!"

15
Floggedhorse

Python 3.5'de, betiği durdurmak ve kullanıcılara bir hata mesajı yazdırmak için yerleşik olanların dışında modüller (örneğin, sys, Biopy) kullanmadan benzer bir kod eklemeye çalıştım. İşte benim örneğim:

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

Daha sonra, sadece bir hata atmanın daha özlü olduğunu gördüm:

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