web-dev-qa-db-ja.com

無限のwhileループの終了

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

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

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

29
Blessoul

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

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

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

69
Steve Howard

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

それが私が信号を推奨する理由です:

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

15
Tristan

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

except KeyboardInterrupt:
    break

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

4
eandersson

pythonを使用して、ポートフォリオの株価を追跡し、自動化された購入/販売コマンドをポートフォリオに送信します。情報は収集されましたが、いつでもプログラムを開始/停止できることに加えて、将来の参照用に株価データを保存したかったのです。

最終的に私のために働いたのは次のことでした:

trigger = True
while trigger == True:
 try:
  (tracking program and purchasing program conditions here)
 except:
  trigger = False

print('shutdown initialized')
df = pd.DataFrame...
save all the datas
print('shutdown complete')

等.

ここから、プログラムは永遠にループしている間、私のブローカーのAPIからのデータのリクエストをスパム送信します。 CTRL-C キーボード割り込み機能は、whileループを無効にするtryループに例外を切り替えます。これにより、スクリプトは、スクリプト全体を突然停止させることなく、データ保存プロトコルを完了できます。

お役に立てれば!

結果

1
Michael Green