回答:
import sys
sys.exit()
sys.exit([arg])
Pythonを終了します。これは、
SystemExit
例外を発生させることで実装される ため、try
ステートメントのfinally節で指定されたクリーンアップアクションが尊重され、外部レベルでの終了試行をインターセプトすることが可能です。オプションの引数argは、終了ステータスを与える整数(デフォルトはゼロ)または別のタイプのオブジェクトです。整数の場合、ゼロは「正常終了」と見なされ、ゼロ以外の値はシェルなどによって「異常終了」と見なされます。ほとんどのシステムでは、0〜127の範囲にある必要があり、それ以外の場合は未定義の結果が生成されます。一部のシステムには、特定の意味を特定の終了コードに割り当てるための規則がありますが、これらは一般的に開発が不十分です。Unixプログラムは通常、コマンドライン構文エラーに2を使用し、その他すべての種類のエラーに1を使用します。別のタイプのオブジェクトが渡される場合、Noneはゼロを渡すことと同等であり、他のオブジェクトはすべて出力さ
stderr
れ、終了コード1になります。特に、sys.exit("some error message")
エラーが発生したときにプログラムを終了する簡単な方法です。ので
exit()
、最終的に「唯一の」例外を発生させ、メインスレッドから呼び出されると、例外が傍受されていない場合、それが唯一のプロセスを終了します。
これは終了する「素敵な」方法であることに注意してください。以下の@ glyphtwistedmatrixは、「強制終了」が必要な場合に使用できることを指摘していますがos._exit(*errorcode*)
、ある程度はOS固有である可能性が高く(たとえば、Windowsでエラーコードを取得しない可能性があります)、間違いなくフレンドリーではありません。プロセスが終了する前にインタープリターがクリーンアップを行うことはできません。
sys.exit()
上昇しSystemExit
、現在のスレッドで例外を。
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Pythonスクリプトを早期に終了する簡単な方法は、組み込みquit()
関数を使用することです。ライブラリをインポートする必要はなく、効率的で簡単です。
例:
#do stuff
if this == that:
quit()
別の方法は:
raise SystemExit
sys.exit
ラッパーの代わりに組み込みの例外を直接発生させています
簡単に使用することもできますexit()
。
ことを覚えておいてくださいsys.exit()
、exit()
、quit()
、とos._exit(0)
殺す Pythonインタプリタを。したがって、によって別のスクリプトから呼び出されたスクリプトに出現すると、execfile()
両方のスクリプトの実行が停止します。
これを回避するには、「execfileで呼び出されるスクリプトの実行を停止する」を参照してください。
マルチスレッドのアプリを作成しているときにraise SystemExit
、sys.exit()
どちらも実行中のスレッドのみを強制終了することがわかりました。一方、os._exit()
プロセス全体を終了します。これについては、「Pythonのスレッド内で呼び出されたときにsys.exit()が終了しないのはなぜですか?」で説明しました。
以下の例には2つのスレッドがあります。ケニーとカートマン。カートマンは永遠に生きるはずですが、ケニーは再帰的に呼ばれ、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()
from sys import exit
exit()
パラメータとして、OSに返される終了コードを渡すことができます。デフォルトは0です。
exit()
とsys.exit()
同じことではありません。exit()
スクリプトで組み込みを使用しないでください。これはインタラクティブシェルのヘルパーにすぎません-使用sys.exit()
私は完全に初心者ですが、確かにこれはよりクリーンでより管理されています
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()
...
プログラムがトレースバックを終了しました(最新の呼び出しが最後):main()のファイル "Z:\ Directory \ testdieprogram.py"、12行目メインのsys.exit(のファイル "Z:\ Directory \ testdieprogram.py"、8行目)SystemExit
編集する
ポイントは、「やめた!!!」ではなく、プログラムがスムーズかつ平和に終了することです。
return
してスクリプトを終了できると提案しようとしている場合、これはまったくナンセンスです。すべてのreturn
値および関数呼び出しへの制御の流れを返してやっています。そこでは、呼び出した関数の呼び出し直後に実行を継続しreturn
ます。もちろん、return
例のようにスクリプトの最後のステートメントがである場合、スクリプトは呼び出された直後に終了します。
exit
-したがって、Pythonプログラマーはこのコードの悪臭にそれほど気づかない場合があります); そして最後に、(3)マルチスレッドコード(これまでのpythonistaはこれまで無視してきました)。
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!")
私の2セント。
Python 3.8.1、Windows 10、64ビット。
sys.exit()
私には直接働きません。
次のループがいくつかあります。
まず、ブール変数を宣言しますimmediateExit
。これをと呼びます。
したがって、プログラムコードの冒頭で、次のように記述します。
immediateExit = False
次に、最も内側の(ネストされた)ループ例外から始めて、次のように記述します。
immediateExit = True
sys.exit('CSV file corrupted 0.')
次に、すぐ外側のループに進み、他のコードによって実行される前に、次のように記述します。
if immediateExit:
sys.exit('CSV file corrupted 1.')
複雑さによっては、上記の記述をセクション以外でも繰り返す必要がある場合があります。
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
カスタムメッセージは、私の個人的なデバッグ用でもあります。数字は同じ目的のためです。つまり、スクリプトが実際に終了する場所を確認するためです。
'CSV file corrupted 1.5.'
私の特定のケースでは、ソフトウェアが破損していることをソフトウェアが検出した場合、ソフトウェアに触れさせたくないCSVファイルを処理しています。したがって、私にとって、破損の可能性を検出した直後にPythonスクリプト全体を終了することが非常に重要です。
そして、私が管理するすべてのループからの段階的なsys.exit-ingに従います。
完全なコード:(内部タスクの所有権コードであるため、いくつかの変更が必要でした):
immediateExit = False
start_date = '1994.01.01'
end_date = '1994.01.04'
resumedDate = end_date
end_date_in_working_days = False
while not end_date_in_working_days:
try:
end_day_position = working_days.index(end_date)
end_date_in_working_days = True
except ValueError: # try statement from end_date in workdays check
print(current_date_and_time())
end_date = input('>> {} is not in the list of working days. Change the date (YYYY.MM.DD): '.format(end_date))
print('New end date: ', end_date, '\n')
continue
csv_filename = 'test.csv'
csv_headers = 'date,rate,brand\n' # not real headers, this is just for example
try:
with open(csv_filename, 'r') as file:
print('***\nOld file {} found. Resuming the file by re-processing the last date lines.\nThey shall be deleted and re-processed.\n***\n'.format(csv_filename))
last_line = file.readlines()[-1]
start_date = last_line.split(',')[0] # assigning the start date to be the last like date.
resumedDate = start_date
if last_line == csv_headers:
pass
elif start_date not in working_days:
print('***\n\n{} file might be corrupted. Erase or edit the file to continue.\n***'.format(csv_filename))
immediateExit = True
sys.exit('CSV file corrupted 0.')
else:
start_date = last_line.split(',')[0] # assigning the start date to be the last like date.
print('\nLast date:', start_date)
file.seek(0) # setting the cursor at the beginnning of the file
lines = file.readlines() # reading the file contents into a list
count = 0 # nr. of lines with last date
for line in lines: #cycling through the lines of the file
if line.split(',')[0] == start_date: # cycle for counting the lines with last date in it.
count = count + 1
if immediateExit:
sys.exit('CSV file corrupted 1.')
for iter in range(count): # removing the lines with last date
lines.pop()
print('\n{} lines removed from date: {} in {} file'.format(count, start_date, csv_filename))
if immediateExit:
sys.exit('CSV file corrupted 1.2.')
with open(csv_filename, 'w') as file:
print('\nFile', csv_filename, 'open for writing')
file.writelines(lines)
print('\nRemoving', count, 'lines from', csv_filename)
fileExists = True
except:
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
with open(csv_filename, 'w') as file:
file.write(csv_headers)
fileExists = False
if immediateExit:
sys.exit('CSV file corrupted 2.')
except:
例外タイプなしで使用してはいけません。を使用するだけの場合except Exception:
(または可能であればさらに詳細な例外タイプ)、sys.exit()
意図したとおりに機能し、この回避策は必要ありません。
sys.exit()
は、実際には重大なエラーに対する一種の最後の手段です。ちょうど私の2セント:)
sys.exit()
バックグラウンドスレッドで発生した場合、おそらく機能しません(プロセスを強制終了せず、スレッドを強制終了します)。