it-swarm-ko.tech

파이썬 스크립트 종료하기

나는 스크립트를 조기에 중단시키는 PHP의 die() 명령을 알고 있습니다.

파이썬에서 이것을 어떻게 할 수 있습니까?

867
Teifion
import sys
sys.exit()

sys 모듈 문서의 세부 정보 :

sys.exit([arg])

파이썬을 종료하십시오. 이것은 SystemExit except를 발생시킴으로써 구현되므로 try statements의 finally 절에 지정된 정리 작업이 가능하며 외부 수준에서 종료 시도를 가로 챌 수 있습니다.

선택적 인수 arg 는 종료 상태 (기본값은 0) 또는 다른 유형의 오브젝트를 제공하는 정수가 될 수 있습니다. 정수 인 경우 0은 "성공적인 종료"로 간주되고 0이 아닌 값은 쉘 등으로 "비정상 종료"로 간주됩니다. 대부분의 시스템에서는 0-127 범위에 있어야하며 그렇지 않으면 정의되지 않은 결과를 생성합니다. 일부 시스템은 특정 종료 코드에 특정 의미를 할당하기위한 규칙이 있지만 일반적으로 개발이 미흡합니다. 유닉스 프로그램은 일반적으로 명령 행 구문 오류에 대해 2를 사용하고 다른 모든 종류의 오류에 대해서는 1을 사용합니다. 다른 유형의 객체가 전달되면 None은 0을 전달하는 것과 같고 다른 객체는 stderr 에 인쇄되어 종료 코드가 1이됩니다. 특히 sys.exit("some error message")은 프로그램을 종료 할 때 빠른 방법입니다. 오류가 발생합니다.

exit() "궁극적으로"유일한 "예외를 제기하기 때문에 메인 스레드에서 호출 될 때 프로세스를 종료하고 예외는 가로 챌 수 없습니다.

이것이 종료하려면 '좋은'방법입니다. @ glyphtwistedmatrix 아래에 지적했듯이 '하드 종료'를 원할 경우 os._exit ( errorcode )를 사용할 수 있습니다. 예를 들어 Windows에서 오류 코드), 프로세스가 종료되기 전에 인터프리터가 정리를 수행하지 않으므로 확실히 덜 친숙합니다.

1180
pjz

초기에 파이썬 스크립트를 종료하는 간단한 방법은 내장 함수 quit ()를 사용하는 것입니다. 라이브러리를 가져올 필요가 없으며 효율적이고 간단합니다.

예:

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

또 다른 방법은 다음과 같습니다.

raise SystemExit
107
Vhaerun

일반적으로 다른 코드보다 친숙하기 때문에 sys.exit를 선호해야하지만, 실제로는 예외가 발생합니다.

프로세스를 즉시 종료해야하고 SystemExit을 catch하는 예외 처리기 내부에있을 수있는 경우 C 레벨에서 즉시 종료되고 정상적인 손상을 수행하지 않는 다른 함수 - os._exit가 있습니다 통역관의 다운; 예를 들어 "atexit"모듈에 등록 된 후크는 실행되지 않습니다.

62
Glyph

단순히 exit()을 사용할 수도 있습니다.

sys.exit(), exit(), quit()os._exit(0) kill Python 인터프리터를 명심하십시오. 따라서 execfile()에 의해 다른 스크립트에서 호출 된 스크립트에 나타나면 두 스크립트의 실행을 중지합니다.

이것을 피하려면 " execfile로 불리는 스크립트의 실행을 멈추십시오 "를보십시오.

58
Space cowboy
from sys import exit
exit()

매개 변수로 종료 코드를 전달하면 OS로 반환됩니다. 기본값은 0입니다.

24
cleg

나는 방금 멀티 스레드 응용 프로그램을 작성할 때 raise SystemExitsys.exit()이 모두 실행중인 스레드 만 죽이는 것을 발견했습니다. 반면 os._exit()은 전체 프로세스를 종료합니다. 이것은 여기서 논의되었습니다.

아래 예제는 2 개의 스레드를 가지고 있습니다. 케니와 카트 먼. Cartman은 영원히 살기로되어 있지만 Kenny는 재귀 적으로 호출되며 3 초 후에 죽어야합니다. (재귀 호출은 최선의 방법은 아니지만 다른 이유가있다)

우리가 Kenny가 죽을 때 Cartman이 죽길 원한다면 Kenny는 os._exit로 떠나야합니다. 그렇지 않으면 Kenny 만 죽고 Cartman은 영원히 살 수 있습니다.

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

나는 총 초심자이지만 분명히 이것은보다 깨끗하고 통제력이있다.

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

if __== '__main__': 
    main()

...

프로그램이 종료되었습니다.

보다

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

if __== '__main__': 
    main()

...

Main () 파일의 "Z :\Directory\testdieprogram.py"파일의 "Z :\Directory\testdieprogram.py"파일의 "Z :\Directory\testdieprogram.py"메인 sys.exit ( ) SystemExit

편집하다

요점은 프로그램이 부드럽고 평화롭게 끝나는 것입니다. "나는 멈췄다 !!!!"

15
Floggedhorse

Python 3.5에서 스크립트를 중지하고 사용자에게 오류 메시지를 인쇄하기 위해 내장 된 것 이외의 모듈 (예 : sys, Biopy)을 사용하지 않고 유사한 코드를 통합하려고했습니다. 여기에 내 예가있다.

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

나중에 나는 에러를 던지는 것이 더 간결하다는 것을 발견했다.

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