2015-10-12 9 views
7

こんにちは私はスクリプトを無限ループで実行するいくつかのアクションがありますが、時にはスクリプトを閉じて新しいバージョンで更新したり、サーバなどで作業をしたりする必要があります。閉じるpythonスクリプトの前にアクション

質問は、私が今何をすべきか

など、私はスクリプトを停止し、近くその前に、スクリプトが近いsqliteの接続、ブローカーとの緊密な接続とループの後にいくつかのアクションを作るために行うことができますどのようにされていますctr + cを停止するまで(終了するまでに数回かかります)、手動でsqlite接続などを閉じます。

+2

[コンテキストマネージャ](https://www.python.org/dev/peps/pep-0343/)を使用し、 '__exit__'で整理しても、' except KeyboardInterrupt'や 'finally' '試しに。 – jonrsharpe

答えて

7

sys.exit

import signal 
import sys 

def signal_handler(signal, frame): 
    print 'You pressed Ctrl+C - or killed me with -2' 
    #.... Put your logic here ..... 
    sys.exit(0) 

signal.signal(signal.SIGINT, signal_handler) 
+0

これは私にとって完璧です。ターミナルが閉まっているときにキャッチする可能性はありますか? –

+0

'SIGHUP'シグナルを抽出する必要があるかもしれません - これは、基本的に、端末が切断されたときにプロセスに送られるシグナルです。 – Vor

0

その後、他のキュートな何かあなたがループの周りtry-exceptブロックを使用してKeyboardInterrupt例外をキャッチできます。また、ブロックがfinallyブロックであっても、プログラムが規則正しく終了する場合は、クリーンアップしてください。

try: 
    <your loop goes here> 
except KeyboardInterrupt: 
    <handle error and do possible special cleanup> 
finally: 
    <do the cleanup that always has to happen> 

注あなただけがキーボード割り込みなし、他のケースでスクリプトを殺すケースを扱うこの方法その:あなたのコードは次のようになります。

あなたがatexitモジュール使用することができwith声明see here for more info(コメントで述べたように)

0
import sys 
try: 
    # Program here 
except KeyboardInterrupt: 
    # Close connections 
    sys.exit(0) 
+1

あなたのコードが何をしているのか、なぜそれが問題を解決するのかについての詳しい説明を追加するには、あなたの投稿を編集することを検討してください。ほとんどの場合、コードが含まれていても(たとえそれが機能していても)、OPが問題を理解するのに役立たない場合があります。 – SuperBiasedMan

2

も使用できます。cleanup()機能は、すべての通常の終了時に呼び出されます

import atexit 

def cleanup(): 
    print "cleanup" 
    # close connections, ... 

atexit.register(cleanup) 

を(これにはCtrl-Cが含まれます)。

関連する問題