52

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

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

基本的に、私の問題は、いつこれを終了したいのかわからないことですが、このwhileループの実行後、プログラムをクラッシュさせて情報を失うのではなく、収集した情報を使用したいと考えています。いつでも while ループを終了するシンプルでエレガントな方法はありますか? キーボードの特定のキーを押すようなものは素晴らしいでしょう。

4

6 に答える 6

104

キーボード割り込みは単なる例外であるため、そのコードを try/except ブロックでラップしてみることができます。

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

その後、CTRL-C でループを終了できます。

于 2013-09-25T01:54:16.267 に答える
34

例外を使用できます。ただし、発生しないはずのものに対してのみ例外を使用する必要があります。だから、これのためではありません。

それが私がシグナルを推奨する理由です:

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を取得すると、プログラムは正常にシャットダウンします。

于 2016-07-29T18:54:24.143 に答える
5

最も簡単な解決策は、割り込みキーが押されたときにKeyboardInterruptをキャッチし、それを使用してループをいつ停止するかを決定することだと思います。

except KeyboardInterrupt:
    break

この例外を探すことの欠点は、ループがまだ実行されている間にユーザーがプログラムを終了できない可能性があることです。

于 2013-09-25T01:54:29.063 に答える