파이썬에서 종료 코드


207

라는 메시지가 나타납니다 script xyz.py returned exit code 0. 이것은 무엇을 의미 하는가?

파이썬에서 종료 코드는 무엇을 의미합니까? 몇 개나 있습니까? 어느 것이 중요합니까?


1
이 메시지는 어디에 있습니까?
제레미 캔 트렐

1
@Jeremy PythonWin의 맨 아래에 있습니다.
sundeep

답변:


223

스크립트에서 찾고있는 것은에 대한 호출 sys.exit()입니다. 해당 메소드에 대한 인수는 종료 코드로 환경에 리턴됩니다.

스크립트가 exit 메소드를 호출하지 않으며 0이 기본 종료 코드 일 가능성이 높습니다.


12
전혀 확실하지 않습니다. 유닉스 / 리눅스에서 표준은 다음과 같습니다 : 모든 것이 정상인 경우 종료 0. 명령을 입력 한 후 echo $ ?: 0을 읽으면 오류없이 반환됩니다. 아이디어는 표준 테스트를하는 것입니다. 코드 xyz.py에 오류가 발생하지 않으면 0을 반환해야합니다!
Bruno von Paris

1
종료 코드를 변경하려면 종료 내장을 사용하여 깨끗하게 종료하는 것을 선호합니다. 이 답변을
vidstige

101

에서 의 문서sys.exit :

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

종료 코드가 사용되는 예는 쉘 스크립트에 있습니다. bash $?에서 마지막 종료 상태에 대한 특수 변수 를 확인할 수 있습니다 .

me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43

개인적으로 /usr/include/asm-generic/errno.h(Linux 시스템에서) 종료 코드를 사용하려고 시도 하지만 이것이 올바른지 여부는 알 수 없습니다.


3
다른 게시물 에서이 링크를 찾았습니다 : tldp.org/LDP/abs/html/exitcodes.html 유용 할 수 있습니다. :)
Eigir

9
errno.h는 일반적으로 함수 호출 종료 코드입니다. 프로그램 종료 코드를 표준화하려고하면 /usr/include/sysexits.h가 대부분의 POSIX 시스템에 존재합니다.
mpounsett

1
"Unix 프로그램은 일반적으로 명령 행 구문 오류에 2를 사용합니다"라는 것을 아는 것이 좋습니다.
dantiston

2
@dantiston Concur. 다이 하드 양모 염색 젠투 옹호자, 그러나 나는이 운명의 날까지 그것을 알지 못했습니다. ( 부끄러운 일이 이제 끝났습니다. ) 이와 관련하여 줄이 일치하지 않고 실제 오류가 발생 하면 grep종료하여이 추세를 깨뜨 립니다. 고마워요, 스톨 맨 12
Cecil Curry

32

레코드의 경우 여기에 정의 된 POSIX 표준 종료 코드를 사용할 수 있습니다 .

예:

import sys, os

try:
    config()
except:
    sys.exit(os.EX_CONFIG) 
try:
    do_stuff()
except:
    sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok

3
에 따르면 문서 가 완전히 휴대용되지 않도록 다음은 유닉스 운영 체제에서 사용할 수 있습니다.
피닉스

1
모든 운영 체제에서 사용 가능한 휴대용 POSIX 코드를 원하면 exitstatusPyPI 패키지를 참조하십시오 .
피닉스

1
해당 패키지의 전체는 성공의 경우 0이고 실패의 경우 1입니다.
Pavel Minaev

25

errno표준 종료 코드를 정의 하는 모듈이 있습니다.

예를 들어 Permission denied 는 오류 코드 13입니다 .

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

36
이것은 올바르지 않습니다. 이 errno는 프로세스 종료 코드로 사용되지 않습니다. 이들은 내부적으로 프로그램, 특히 C 언어로 작성된 오류 코드입니다. Python의 경우 가능할 때마다 예외를 사용하십시오.
SvdB

2
네가 옳아. 이들은 내부적으로 사용됩니다. 그러나 일반적으로 최종 사용자 수준에서는 예외가 발생하지 않습니다. x는 임의로 선택한 정수로 sys.exit (x)를 사용합니다. 그러나 EX_로 시작하고 'os'모듈에서 정의 된 것을 사용할 수 있습니다. os.EX_OK 또는 os.EX_IOERR
Oli

2
미안하지만 오해의 소지가 있기 때문에 투표를 거부하고 있습니다. 종료 상태 코드와 오류 번호는 상호 교환 가능 하지 않습니다 . 주어진 예를 사용하여 "permission denied"는 오류 코드 13 ( errnoerrno.h 에 따름 )을 갖지만 종료 상태 코드 77 ( ossysexits.h 에 따름)을 갖습니다 . 전자를 배출하는 프로그램은 표준 이 아니며 ( 사실상 ), 후자를 기대하는 다른 사람들과 잘 어울리지 않습니다.
마크 G.

14

종료 코드 0은 일반적으로 "아무것도 없습니다"를 의미합니다. 그러나 스크립트 프로그래머가 규칙을 따르지 않으면 소스를 참조하여 그 의미를 확인해야 할 수 있습니다. 일반적으로 0이 아닌 값은 오류 코드로 반환됩니다.


6

대답은 "종료 코드 0의 의미에 따라 다름"입니다.

그러나 대부분의 경우 "모든 것이 정상입니다"라는 의미입니다


나는 POSIX를 좋아한다 :

따라서 쉘에서 다음을 입력합니다.

python script.py && echo 'OK' || echo 'Not OK'

내 파이썬 스크립트가 호출 sys.exit(0)하면 셸은 'OK'를 반환합니다

파이썬 스크립트가 호출 sys.exit(1)하거나 0이 아닌 정수를 호출 하면 쉘은 'Not OK'를 반환합니다

쉘에 대해 영리한 태도를 취하고 스크립트에 대한 문서 (또는 소스)를 읽고 종료 코드의 의미를 확인하십시오.


완벽을 기하기 위해 Python 스크립트에서 오류가 발생했거나 구문 오류가있는 경우 'Not OK'가 인쇄됩니다.
Shital Shah

5

운영 체제 명령에는 종료 코드가 있습니다. 이것에 대한 자료를 보려면 리눅스 종료 코드 를 찾으십시오 . 쉘은 종료 코드를 사용하여 프로그램의 작동, 문제점 또는 실패 여부를 판별합니다. 표준 (또는 최소한 일반적으로 사용되는) 종료 코드를 작성하려는 노력이 있습니다. 이 Advanced Shell Script 게시를 참조하십시오 .


5

sys.exit ()를 사용하는 대신 exit (0)이 내장 된 완전한 종료를 권장합니다

이것이 좋은 조언인지 확실하지 않습니다.

언급 된 바로 문서는 다음과 같습니다.

-S 명령 줄 옵션이 지정된 경우를 제외하고 시작 중에 자동으로 가져 오는 사이트 모듈은 내장 네임 스페이스에 여러 상수를 추가합니다. 대화식 인터프리터 쉘에 유용 하며 프로그램에서 사용해서는 안됩니다 .

그때:

이탈 (코드 = 없음)

인쇄시 "quit () 또는 Ctrl-D (예 : EOF)를 사용하여 종료"와 같은 메시지를 인쇄하고 호출되면 지정된 종료 코드를 사용하여 SystemExit를 올리십시오.

sys.exit () 문서와 비교하면 SystemExit예외를 발생시키는 동일한 메커니즘을 사용 하고 있습니다.


5

표준 POSIX 종료 코드 를 이식 가능하게 사용하려면 exitstatusPyPI 의 패키지를 참조하십시오 .

패키지를 설치하십시오 :

$ pip install exitstatus

코드에서 사용 :

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

4

종료 코드는 스크립트 작성자가 지정한 의미 만 있습니다. 유닉스 전통은 종료 코드 0이 '성공'을 의미하고 다른 것은 실패라는 것을 의미합니다. 주어진 스크립트의 종료 코드가 무엇을 의미하는지 확인하는 유일한 방법은 스크립트 자체를 검사하는 것입니다.


2

많은 프로그래밍 언어의 종료 코드는 프로그래머에게 달려 있습니다. 따라서 프로그램 소스 코드 (또는 수동)를 봐야합니다. 0은 일반적으로 "모든 것이 잘되었다"는 의미입니다.


-2

예외 처리기 및 기타 작업을 수행 하려면 프로세스를 갑자기 종료하는 exit(0)대신 사용 sys.exit()하는 것이 아니라 완전히 종료하는 것이 좋습니다 .


차이점은 무엇입니까? 이 정보는 어디에서 왔습니까? "종료시"처리기의 실행을 의미합니까, 아니면 정확히 무엇을 의미합니까? SystemExit어느쪽으로 든 올라간 것처럼 보입니다.
0xC0000022L

mm, 나는 그것을 혼동 os._exit양쪽이 인상 보인다 SystemExit.
vidstige

1
잘못된 : sys.exit() 않습니다 처럼 깨끗하게 종료 exit(). 둘 다 똑같은 일을합니다 : SystemExit예외를 제기하십시오 . 실제로 exit()는 스크립트가 아닌 대화식 세션을위한 것이므로 개념적 sys.exit() 으로 표시된 것입니다. 와 혼동 할 수 있습니다 os._exit(). 갑자기 종료됩니다.
MestreLion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.