web-dev-qa-db-ja.com

Pythonスクリプトを終了する

PHPのdie()コマンドがスクリプトを早く停止させることに気付きました。

Pythonでこれを行うにはどうすればいいですか。

867
Teifion
import sys
sys.exit()

sysモジュールのドキュメントからの詳細

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 )を使うことができることを指摘しています。これは、プロセスが終了する前にインタプリタにクリーンアップを実行させないため、絶対に友好的ではありません。

1180
pjz

Pythonスクリプトを早く終了させる簡単な方法は、組み込み関数quit()を使うことです。ライブラリをインポートする必要はなく、効率的かつ簡単です。

例:

#do stuff
if this == that:
  quit()
258
j.m.g.r

別の方法は:

raise SystemExit
107
Vhaerun

sys.exitは他のコードに「より親しみやすい」という理由で一般的にはお勧めですが、実際には例外が発生するだけです。

すぐにプロセスを終了する必要があり、SystemExitをキャッチする例外ハンドラの内部にいる可能性がある場合は、別の関数 - os._exitがあります。 - 通訳のダウンたとえば、 "atexit"モジュールに登録されているフックは実行されません。

62
Glyph

単にexit()を使うこともできます。

sys.exit()exit()quit()、そしてos._exit(0) kill Pythonインタプリタ。したがって、execfile()によって別のスクリプトから呼び出されたスクリプト内に現れると、両方のスクリプトの実行を停止します。

これを避けるには、 " execfileで呼び出されたスクリプトの実行を停止する "を参照してください。

58
Space cowboy
from sys import exit
exit()

パラメータとして、終了コードを渡すことができます。終了コードはOSに返されます。デフォルトは0です。

24
cleg

マルチスレッドアプリケーションを作成するとき、raise SystemExitsys.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()
21
eaydin

私は全くの初心者ですが、確かにこれはよりクリーンでより統制されています

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

編集する

重要なのは、プログラムが 「停止しました!!!!」ではなく、円滑かつ平和的に終了するということです。

15
Floggedhorse

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!");
6
David C.