2013-09-25 28 views
13

現在、基本的に無限ループwhileループを実行してユーザーからデータを収集するコードがあります。テキストファイルの内容に基づいて辞書やリストを絶えず更新しています。参考のために:無限のwhileループを終了する

while (True): 
    IDs2=UpdatePoints(value,IDs2) 
    time.sleep(10) 

は基本的に、私の問題は、私は最後にこれをしたいとき、私は知らないということですが、このwhileループの後に私は私のプログラムをクラッシュことによってそれを失うことはありません、収集した情報を使用したい実行されます。私が望むたびにwhileループから抜ける単純でエレガントな方法はありますか?私のキーボードで特定のキーを押すのと同じようなものはすばらしいでしょう。

答えて

38

キーボード割り込みがちょうど例外ですので、あなたは、try/exceptブロックにそのコードをラップしてみてください:

try: 
    while True: 
     IDs2=UpdatePoints(value,IDs2) 
     time.sleep(10) 
except KeyboardInterrupt: 
    print('interrupted!') 

その後、あなたはCTRL-Cでループを終了することができます。

+0

あなたはすごいですね。これはうまくいった。 – Blessoul

+0

私は、これが私が見たtry/exceptブロックのもう少しの使い方の一つだと言わざるを得ない。私はこのパターンをデバッグのために試してみるかもしれません。 – reem

+0

これはPython 3.5ではうまくいきません – dopatraman

4

interrupt key is pressedは、KeyboardInterruptをキャッチしてループをいつ停止するかを判断するのが最も簡単な解決策だと思います。

この例外を探す際の欠点は、ループが実行中にユーザーがプログラムを終了できないことがあることです。

+0

CTRL + BREAKは、少なくともWindowsではスーパー割り込みキーです。 –

6

例外を使用できます。しかし、起こりそうにないものについては例外を使うべきです。そうではありません。

私は信号recommand理由です:

import sys, signal 
def signal_handler(signal, frame): 
    print("\nprogram exiting gracefully") 
    sys.exit(0) 

signal.signal(signal.SIGINT, signal_handler) 

を、あなたのプログラムの先頭でこれを置く必要がありますし、あなたのプログラムの中でどこにCtrl + Cを押すと、それは優雅に

コードの説明をシャットダウンします:

syssignalsをインポートします。 その後、終了時に実行される関数を作成します。 sys.exit(0)は、終了コード0(すべてがうまくいったコード)でプログラミングを停止します。

プログラムがctrl-cまたは端末のkillコマンドによってSIGINTを取得すると、プログラムは正常に終了します。

関連する問題