PHPのdie()
コマンドがスクリプトを早く停止させることに気付きました。
Pythonでこれを行うにはどうすればいいですか。
import sys
sys.exit()
sys.exit([arg])
Pythonを終了します。これは
SystemExit
例外を発生させることで実装されているので、try
ステートメントのfinally節で指定されたクリーンアップアクションは尊重され、外部レベルでの終了の試みを傍受することが可能です。オプションの引数 arg は、終了ステータスを示す整数(デフォルトは0)、または別の種類のオブジェクトです。整数の場合、ゼロなどは「正常終了」と見なされ、ゼロ以外の値はシェルなどによって「異常終了」と見なされます。ほとんどのシステムでは、0から127の範囲であることを要求し、そうでなければ未定義の結果を生成します。いくつかのシステムは特定の意味を特定の終了コードに割り当てるための規約を持っています、しかしこれらは一般的に未発達です。 Unixプログラムは通常、コマンドライン構文エラーに2を、その他の種類のエラーに1を使います。他のタイプのオブジェクトが渡されると、Noneはゼロを渡すのと同じことになり、他のオブジェクトは
stderr
に出力され、終了コード1が返されます。特に、sys.exit("some error message")
はプログラムが終了したときにプログラムを終了します。エラーが発生します。
exit()
究極的には "only"は例外を発生させるので、メインスレッドから呼び出されたときにのみプロセスを終了し、例外はインターセプトされません。
これは終了するための 'いい'方法です。 @ glyphtwistedmatrix 以下は、 'ハード終了'したい場合はos._exit( errorcode )を使うことができることを指摘しています。これは、プロセスが終了する前にインタプリタにクリーンアップを実行させないため、絶対に友好的ではありません。
Pythonスクリプトを早く終了させる簡単な方法は、組み込み関数quit()を使うことです。ライブラリをインポートする必要はなく、効率的かつ簡単です。
例:
#do stuff
if this == that:
quit()
別の方法は:
raise SystemExit
sys.exit
は他のコードに「より親しみやすい」という理由で一般的にはお勧めですが、実際には例外が発生するだけです。
すぐにプロセスを終了する必要があり、SystemExit
をキャッチする例外ハンドラの内部にいる可能性がある場合は、別の関数 - os._exit
があります。 - 通訳のダウンたとえば、 "atexit"モジュールに登録されているフックは実行されません。
単にexit()
を使うこともできます。
sys.exit()
、exit()
、quit()
、そしてos._exit(0)
kill Pythonインタプリタ。したがって、execfile()
によって別のスクリプトから呼び出されたスクリプト内に現れると、両方のスクリプトの実行を停止します。
これを避けるには、 " execfileで呼び出されたスクリプトの実行を停止する "を参照してください。
from sys import exit
exit()
パラメータとして、終了コードを渡すことができます。終了コードはOSに返されます。デフォルトは0です。
マルチスレッドアプリケーションを作成するとき、raise SystemExit
とsys.exit()
は両方とも実行中のスレッドだけを強制終了することを私はちょうど見つけました。一方、os._exit()
はプロセス全体を終了します。これは議論された ここ。
以下の例には2つのスレッドがあります。ケニーとカートマン。 Cartmanは永遠に生きることになっています、しかし、ケニーは再帰的に呼ばれて、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 __== '__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()
私は全くの初心者ですが、確かにこれはよりクリーンでより統制されています
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __== '__main__':
main()
...
プログラム終了
より
import sys
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
sys.exit()
print 'You wont see this'
if __== '__main__':
main()
...
プログラムがトレースバックを終了しました(最新の呼び出しは最後):main ""のファイル "Z:\ Directory\testdieprogram.py"、行12、main sys.exitのファイル "Z:\ Directory\testdieprogram.py"、行8 SystemExit
編集する
重要なのは、プログラムが 「停止しました!!!!」ではなく、円滑かつ平和的に終了するということです。
Python 3.5では、スクリプトを停止してユーザーにエラーメッセージを表示するために組み込まれているもの以外のモジュール(sys、Biopyなど)を使用せずに同様のコードを組み込もうとしました。これが私の例です:
## My example:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
print("Start codon is missing! Check your DNA sequence!");
exit(); ## as most folks said above
後で、私はそれが単にエラーをスローすることがより簡潔であることがわかりました:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!");