と言うメッセージが表示されましたscript xyz.py returned exit code 0
。これは何を意味するのでしょうか?
Pythonの終了コードはどういう意味ですか?いくつありますか?どれが重要ですか?
と言うメッセージが表示されましたscript xyz.py returned exit code 0
。これは何を意味するのでしょうか?
Pythonの終了コードはどういう意味ですか?いくつありますか?どれが重要ですか?
回答:
スクリプトで探しているのは、への呼び出しsys.exit()
です。そのメソッドへの引数は、終了コードとして環境に返されます。
スクリプトが決してexitメソッドを呼び出さない可能性がかなり高く、0がデフォルトの終了コードです。
以下からのドキュメント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システムで)見つけた終了コードを使用しようとしていますが、これが正しいことかどうかはわかりません。
grep
終了し1
、2
実際のエラーで終了することにより、この傾向を打破することに注意してください。ストールマン、どうもありがとう。
レコードには、ここで定義されている 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
exitstatus
PyPIパッケージを参照してください。
errno
標準の終了コードを定義するモジュールがあります:
たとえば、拒否されたアクセス許可はエラーコード13です。
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
errno
とerrno.hによる)ですが、終了ステータスコードは77(os
とsysexits.hによる)です。前者を出力するプログラムは非標準(事実上のジュール)であり、後者を期待する他のプログラムとうまく連携しません。
答えは「終了コード0の意味に依存する」です
ただし、ほとんどの場合、これは「すべて問題ない」を意味します
私はPOSIXが好きです:
したがって、シェルで次のように入力します。
python script.py && echo 'OK' || echo 'Not OK'
私のPythonスクリプトがsys.exit(0)
シェルを呼び出すと、シェルは「OK」を返します
私のpythonスクリプトがsys.exit(1)
(またはゼロ以外の整数)を呼び出した場合、シェルは「Not OK」を返します
シェルをうまく使い、スクリプトのドキュメント(またはソース)を読んで、終了コードの意味を確認するのはあなたの仕事です。
オペレーティングシステムコマンドには終了コードがあります。Linuxの終了コードを探して、これに関する資料を確認してください。シェルは、終了コードを使用して、プログラムが機能したか、問題が発生したか、または失敗したかを判断します。標準(または少なくとも一般的に使用される)終了コードを作成するための努力がいくつかあります。この高度なシェルスクリプトの投稿を参照してください。
sys.exit()を使用するのではなく、組み込みのexit(0)でクリーンシャットダウンをお勧めします
これが良いアドバイスかどうかはわかりません。
言及されたまさにその文書は次のとおりです。
サイトモジュール(-Sコマンドラインオプションが指定されている場合を除いて、起動時に自動的にインポートされます)は、組み込みの名前空間にいくつかの定数を追加します。これらは対話型インタープリターシェルに役立ち、プログラムでは使用しないでください。
次に:
exit(コード=なし)
印刷時に「quit()またはCtrl-D(EOF)を使用して終了する」などのメッセージを出力し、呼び出されたときに、指定された終了コードでSystemExitを発生させるオブジェクト。
それをsys.exit()のドキュメントと比較すると、SystemExit
例外を発生させているのと同じメカニズムを使用しています。
標準のPOSIX終了コードを移植して使用する場合は、exitstatus
PyPI のパッケージを参照してください。
パッケージをインストールします。
$ pip install exitstatus
あなたのコードで使用してください:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
例外ハンドラなどを実行できるようにするには、プロセスを突然終了するのexit(0)
ではなく、組み込みのクリーンシャットダウンをお勧めsys.exit()
します。
SystemExit
いずれかの方法で発生するように見えます。
os._exit
、両方が発生するようSystemExit
です。
sys.exit()
ないと同じように、きれいにシャットダウンをexit()
。どちらも同じことを行いSystemExit
ます。例外を発生させます。実際、これexit()
はスクリプトではなく、インタラクティブなセッションのためのものなので、概念的にsys.exit()
は示されているものです。と混乱するかもしれませんがos._exit()
、それは突然終了するものです。