Pythonの終了コード


207

と言うメッセージが表示されましたscript xyz.py returned exit code 0。これは何を意味するのでしょうか?

Pythonの終了コードはどういう意味ですか?いくつありますか?どれが重要ですか?


1
このメッセージはどこに表示されていますか?
Jeremy Cantrell、

1
@Jeremy PythonWinの下部。
太陽が深い2008年

回答:


223

スクリプトで探しているのは、への呼び出しsys.exit()です。そのメソッドへの引数は、終了コードとして環境に返されます。

スクリプトが決してexitメソッドを呼び出さない可能性がかなり高く、0がデフォルトの終了コードです。


12
まったくわからない。Unix / Linuxでは、標準は次のとおりです。すべてが正常である場合は、exit 0です。コマンドを入力し、$?をエコーし​​ます。0を読み取ると、エラーなしで返されます。アイデアは、標準的なテストを持つことです。コードxyz.pyでエラーが発生しなかった場合は、0を返す必要があります。
Bruno von Paris、

1
終了コードを変更する場合は、組み込みのexitを使用して完全に終了することをお
勧めし

101

以下からのドキュメントsys.exit

オプションの引数argは、終了ステータスを与える整数(デフォルトはゼロ)、または別のタイプのオブジェクトです。整数の場合、ゼロは「正常終了」と見なされ、ゼロ以外の値はシェルなどによって「異常終了」と見なされます。ほとんどのシステムでは、0〜127の範囲にある必要があり、それ以外の場合は未定義の結果が生成されます。一部のシステムには、特定の意味を特定の終了コードに割り当てるための規則がありますが、これらは一般的に開発が不十分です。Unixプログラムは通常、コマンドライン構文エラーに2を使用し、その他すべての種類のエラーに1を使用します。

終了コードが使用される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 2008年

9
errno.hは通常、関数呼び出しの終了コード用です。プログラムの終了コードを標準化しようとすると、ほとんどのPOSIXシステムに/usr/include/sysexits.hが存在します。
mpounsett 2012年

1
「Unixプログラムは通常、コマンドライン構文エラーに2を使用する」ということを知っておくのはとても良いことです。
ダンティストン2015年

2
@dantiston Concur。真っ白な羊毛に染められたGentooの擁護者ですが、私はそれを知りませんでした...この運命の日まで。(私の恥は今終わります)関連して、は、一致する行がないときにgrep終了し12実際のエラーで終了することにより、この傾向を打破することに注意してください。ストールマン、どうもありがとう。
セシルカレー

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
ドキュメントによると、これらはUnixオペレーティングシステムでのみ使用できるため、完全にポータブルではありません。
フェニックス2016年

1
すべてのオペレーティングシステムで使用できるポータブルPOSIXコードが必要な場合は、exitstatusPyPIパッケージを参照してください。
フェニックス

1
そのパッケージ全体は、成功の場合は0、失敗の場合は1です。
Pavel Minaev

25

errno標準の終了コードを定義するモジュールがあります:

たとえば、拒否されたアクセス許可はエラーコード13です。

import errno, sys

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

36
これは誤りです。これらのerrnoは、プロセスの終了コードとして使用するためのものではありません。これらは、プログラムの内部で使用することを目的とした低レベルのエラーコードであり、特にC言語で記述されたものです。Pythonの場合は、可能な限り例外を使用してください。
SvdB 2014

2
あなたが正しい。これらは内部で使用されます。ただし、通常はエンドユーザーレベルで例外を発生させません。sys.exit(x)を使用します。xは任意に選択した整数です。ただし、EX_で始まり、 'os'モジュールで定義されたものを使用できます。os.EX_OKまたはos.EX_IOERRと同様
Oli

2
申し訳ありませんが、誤解を招く可能性があるため、これにも反対票を投じています。終了ステータスコードとエラー番号は互換性がなく、相補的でもありません。与えられた例を使用すると、「許可が拒否されました」のエラーコードは13(errnoerrno.hによる)ですが、終了ステータスコードは77(ossysexits.hによる)です。前者を出力するプログラムは非標準(事実上のジュール)であり、後者を期待する他のプログラムとうまく連携しません。
マークG.

14

通常、終了コード0は、「ここでは問題ありません」という意味です。ただし、スクリプトのプログラマが慣例に従わなかった場合は、ソースを調べて、その意味を確認する必要があるかもしれません。通常、ゼロ以外の値がエラーコードとして返されます。


6

答えは「終了コード0の意味に依存する」です

ただし、ほとんどの場合、これは「すべて問題ない」を意味します


私はPOSIXが好きです:

したがって、シェルで次のように入力します。

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

私のPythonスクリプトがsys.exit(0)シェルを呼び出すと、シェルは「OK」を返します

私のpythonスクリプトがsys.exit(1)(またはゼロ以外の整数)を呼び出した場合、シェルは「Not OK」を返します

シェルをうまく使い、スクリプトのドキュメント(またはソース)を読んで、終了コードの意味を確認するのはあなたの仕事です。


完全を期すために、Pythonスクリプトでエラーが発生した場合、または構文エラーが発生した場合、「Not OK」が出力されます。
Shital Shah

5

オペレーティングシステムコマンドには終了コードがあります。Linuxの終了コードを探して、これに関する資料を確認してください。シェルは、終了コードを使用して、プログラムが機能したか、問題が発生したか、または失敗したかを判断します。標準(または少なくとも一般的に使用される)終了コードを作成するための努力がいくつかあります。この高度なシェルスクリプトの投稿を参照してください。


5

sys.exit()を使用するのではなく、組み込みのexit(0)でクリーンシャットダウンをお勧めします

これが良いアドバイスかどうかはわかりません。

言及されたまさにその文書は次のとおりです。

サイトモジュール(-Sコマンドラインオプションが指定されている場合を除いて、起動時に自動的にインポートされます)は、組み込みの名前空間にいくつかの定数を追加します。これらは対話型インタープリターシェルに役立ち、プログラムでは使用しないでください

次に:

exit(コード=なし)

印刷時に「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

終了コードは、スクリプト作成者によって割り当てられた意味を持つだけです。Unixの伝統では、終了コード0は「成功」を意味し、それ以外は失敗です。特定のスクリプトの終了コードの意味を確認する唯一の方法は、スクリプト自体を調べることです。


2

多くのプログラミング言語の終了コードはプログラマ次第です。したがって、プログラムのソースコード(またはマニュアル)を確認する必要があります。通常、ゼロは「すべてがうまくいった」ことを意味します。


-2

例外ハンドラなどを実行できるようにするには、プロセスを突然終了するのexit(0)ではなく、組み込みのクリーンシャットダウンをお勧めsys.exit()します。


それで、違いは何ですか?この情報はどこから来たのですか?「出口」ハンドラの実行を意味するのですか、それとも正確に何を指しているのですか?SystemExitいずれかの方法で発生するように見えます。
0xC0000022L 2017年

mm、私はそれを混乱させましたos._exit、両方が発生するようSystemExitです。
vidstige 2017年

1
間違っ:sys.exit() ないと同じように、きれいにシャットダウンをexit()。どちらも同じことを行いSystemExitます。例外を発生させます。実際、これexit()はスクリプトではなく、インタラクティブなセッションのためのものなので、概念的にsys.exit() 示されているものです。と混乱するかもしれませんがos._exit()、それは突然終了するものです。
MestreLion
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.