web-dev-qa-db-ja.com

Pythonの終了コード

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

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

165
sundeep

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

スクリプトがexitメソッドを呼び出すことは決してなく、0がデフォルトの終了コードです。

186
Dave Costa

sys.exitのドキュメント から---:

オプションの引数argは、終了ステータスを示す整数(デフォルトは0)、または別の種類のオブジェクトです。整数の場合、ゼロなどは「正常終了」と見なされ、ゼロ以外の値はシェルなどによって「異常終了」と見なされます。ほとんどのシステムでは、0から127の範囲であることを要求し、そうでなければ未定義の結果を生成します。いくつかのシステムは特定の意味を特定の終了コードに割り当てるための規約を持っています、しかしこれらは一般的に未発達です。 Unixプログラムは通常、コマンドライン構文エラーに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システム上)にある終了コードを使おうとしますが、これが正しいことかどうかわかりません。

86
Eigir

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

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

import errno, sys

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

レコードには、ここで定義されている 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
23
laffuste

終了コード0は通常、「ここで問題ないこと」を意味します。しかし、スクリプトのプログラマーが規約に従わなかった場合は、その意味を理解するためにソースを調べなければならない可能性があります。通常、ゼロ以外の値がエラーコードとして返されます。

14
Sam Corder

オペレーティングシステムのコマンドには終了コードがあります。これに関するいくつかの資料を見るために linux exit codes を探してください。シェルは終了コードを使用して、プログラムが機能したのか、問題があるのか​​、または失敗したのかを判断します。標準の(または少なくとも一般的に使用されている)終了コードを作成するためのいくつかの努力があります。こちらをご覧ください Advanced Shell Script 投稿。

5
S.Lott

移植可能なように 標準のPOSIX終了コード を使用したい場合は、PyPIの exitstatus パッケージを参照してください。

パッケージをインストールしてください。

pip install exitstatus

あなたのコードで使う:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)
5
phoenix

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

4
Harper Shelby

答えは、「終了コード0が何を意味するのかによります」です。

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


私はPOSIXが好きです:

だから、シェル上で、私は入力します:

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

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

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

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

4
FlipMcF

Sys.exit()を使うよりもexit(0)を組み込んだクリーンシャットダウンをお勧めします。

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

非常にドキュメンテーションが言及されている 読みます:

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

その後:

終了(code = None)

印刷時に「quit()またはCtrl-D(すなわちEOF)を使用して終了する」などのメッセージを印刷し、呼び出されたときに指定された終了コードでSystemExitを発生させるオブジェクト。

これを sys.exit() のドキュメントと比較すると、SystemExit例外を発生させるのと同じメカニズムが使用されています。

3
weakcamel

多くのプログラミング言語の終了コードはプログラマ次第です。だからあなたのプログラムのソースコード(またはマニュアル)を見なければなりません。ゼロは通常「すべてがうまくいった」ことを意味します。

2
Davide

例外ハンドラなどを実行できるようにするには、プロセスを突然終了させるexit(0)を使用するのではなく、 sys.exit() ビルトインを使用してクリーンシャットダウンを実行することをお勧めします。

0
vidstige