1261

die()スクリプトを早期に終了する PHPのコマンドを認識しています。

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

4

12 に答える 12

1648
import sys
sys.exit()

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

sys.exit([arg])

Python を終了します。これは SystemExit例外を発生させることによって実装されるため、ステートメントの finally 句で指定されたクリーンアップ アクションtryが受け入れられ、外部レベルでの終了試行をインターセプトすることが可能です。

オプションの引数argは、終了ステータス (デフォルトはゼロ) を示す整数、または別のタイプのオブジェクトにすることができます。整数の場合、ゼロは「正常終了」と見なされ、ゼロ以外の値はシェルなどによる「異常終了」と見なされます。ほとんどのシステムでは、0 ~ 127 の範囲である必要があり、それ以外の場合は未定義の結果が生成されます。一部のシステムには、特定の意味を特定の終了コードに割り当てるための規則がありますが、これらは一般的に未開発です。Unix プログラムは通常、コマンド ライン構文エラーに対して 2 を使用し、他のすべての種類のエラーに対して 1 を使用します。If another type of object is passed, None is equal to passed zero, and any other object is displayed to stderrand results in an exit code of 1. 特に、 sys.exit("some error message")は、エラーが発生したときにプログラムをすばやく終了する方法です。

最終的に「のみ」は例外を発生させるためexit()、メイン スレッドから呼び出されたときにのみプロセスを終了し、例外はインターセプトされません。

これは終了するための「良い」方法であることに注意してください。以下の@ glyphtwistedmatrixは、「ハード終了」が必要な場合は を使用できることを指摘していますがos._exit(*errorcode*)、ある程度は OS 固有である可能性が高く (たとえば、Windows ではエラーコードを取らない可能性があります)、プロセスが終了する前に、インタープリターにクリーンアップを行わせません。一方、実行中のすべてのスレッドを含むプロセス全体をsys.exit()強制終了しますが、(ドキュメントに記載されているように)メインスレッドから呼び出された場合にのみ終了し、他のスレッドは実行されていません。

于 2008-09-16T15:36:36.680 に答える
455

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

例:

#do stuff
if this == that:
  quit()
于 2013-02-12T15:50:06.713 に答える
138

別の方法は次のとおりです。

raise SystemExit
于 2008-09-16T15:37:13.763 に答える
96

単純に使用することもできますexit()

、、、およびPython インタープリターを強制sys.exit()終了することに注意してください。そのため、 によって別のスクリプトから呼び出されたスクリプトに表示されると、両方のスクリプトの実行が停止します。exit()quit()os._exit(0) execfile()

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

于 2013-04-22T14:57:00.843 に答える
75

sys.exit他のコードに対してより「友好的」であるため、一般的には好まれるはずですが、実際に行うことは例外を発生させることだけです。

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

于 2008-09-16T20:08:04.500 に答える
67

raise SystemExitマルチスレッドアプリを作成するときにsys.exit()、実行中のスレッドのみを強制終了することがわかりました。一方、os._exit()プロセス全体を終了します。これについては、「Python のスレッド内で呼び出されたときに sys.exit() が終了しないのはなぜですか?」で説明されています。

以下の例には 2 つのスレッドがあります。ケニーとカートマン。Cartman は永遠に生き続けるはずですが、Kenny は再帰的に呼び出され、3 秒後に死ぬはずです。(再帰呼び出しは最善の方法ではありませんが、他の理由がありました)

ケニーが死んだときにカートマンも死ぬようにしたい場合は、ケニーは で立ち去る必要がありos._exitます。そうしないと、ケニーだけが死に、カートマンは永遠に生き続けます。

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 __name__ == '__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()
于 2016-11-10T10:59:45.547 に答える
36
from sys import exit
exit()

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

于 2008-09-16T15:38:28.877 に答える
21

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

def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        return
    print 'You wont see this'

if __name__ == '__main__': 
    main()

...

プログラム終了

よりも

import sys
def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        sys.exit()
    print 'You wont see this'

if __name__ == '__main__': 
    main()

...

プログラム終了 トレースバック (最新の呼び出しが最後): ファイル "Z:\Directory\testdieprogram.py"、12 行目、main() ファイル "Z:\Directory\testdieprogram.py"、8 行目、main sys.exit( ) システム終了

編集

「やめた!!!!」ではなく、スムーズに平和に番組が終了するのがポイントです。

于 2014-03-19T11:13:22.700 に答える
10

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!")
于 2016-12-27T18:12:16.587 に答える