[python] 파이썬 스크립트를 종료하는 방법

die()스크립트를 일찍 종료하는 PHP 의 명령을 알고 있습니다.

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



답변

import sys
sys.exit()

sys모듈 문서의 세부 사항 :

sys.exit([arg])

파이썬에서 빠져 나옵니다. 이는 SystemExit예외 를 발생시켜 구현 되므로 finally try명령문 절에 지정된 정리 조치 가 적용되며
외부 레벨에서 종료 시도를 가로 챌 수 있습니다.

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

때문에 exit()궁극적으로 “전용”예외가 발생 메인 쓰레드에서 호출 및 예외가 차단되지 않을 때, 그것은 단지 프로세스를 종료합니다.

이것이 ‘좋은’종료 방법입니다. 아래의 @ glyphtwistedmatrix 는 ‘하드 엑시트’를 원한다면 os._exit(*errorcode*)어느 정도 운영 체제에 따라 다를 수 있지만 (예를 들어 Windows에서 오류 코드가 발생하지 않을 수 있음)을 사용할 수 있으며 , 그 때문에 친숙하지 않다는 점을 지적합니다. 프로세스가 종료되기 전에 인터프리터가 정리를 수행하도록 허용하지 않습니다.


답변

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

예:

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


답변

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

raise SystemExit


답변

간단하게 사용할 수도 있습니다 exit().

있다는 사실을 숙지 sys.exit(), exit(), quit(), 및 os._exit(0) 죽일 파이썬 인터프리터를. 따라서에 의해 다른 스크립트에서 호출 된 스크립트에 표시 execfile()되면 두 스크립트의 실행이 중지됩니다.

이를 피하려면 ” execfile로 호출 된 스크립트 실행 중지 “를 참조하십시오 .


답변

일반적으로 sys.exit다른 코드에 비해 “친숙”하기 때문에 선호하지만 실제로는 예외를 발생시키는 것뿐입니다.

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


답변

난 그냥 multithreadded 응용 프로그램을 작성할 때 사실을 발견했습니다 raise SystemExitsys.exit()모두는 실행중인 스레드를 죽인다. 반면에 os._exit()전체 프로세스를 종료합니다. 이것은 ” 파이썬의 스레드 안에서 호출 될 때 sys.exit ()가 종료되지 않는 이유는 무엇입니까? “에서 논의되었습니다 .

아래 예에는 2 개의 스레드가 있습니다. 케니와 카트 맨 카트 만은 영원히 살기로되어 있지만 케니는 재귀 적으로 불려지고 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 __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()


답변

from sys import exit
exit()

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