2016-03-24 13 views
0

私は、raw_inputがキーボード割り込みをキャッチしようとするための少しのPythonコードを持っています。私はこの関数でコードを実行する場合、それは完全に正常に動作します。しかし、私のプログラムでそれを実行すると、キーボードの割り込みがキャッチされていないことを示すprint文は決して作成されません。プログラムは終了しようとし、SIGKILLにエスカレートするまで失敗しますが、これはうまくいきます。私の推測では、キーボード割り込みが捕捉されているため、例外がまったく実行されません。私の質問は、どこでこのような割り込みが発生する可能性があり、どうすればこの割り込みをブロックできないかということです。私の計画は、キーボード割り込みを捕まえるプログラムと、それを殺す自殺の余地を少し残しておくことです。生の入力によるキーボード割り込みの受け取り

ありがとうございます。

ありがとうございました!

import sys 
def interruptable_input(text=''): 
    '''Takes raw input, but accepts keyboard interrupt''' 
    try: 
    return raw_input(text) 
    except KeyboardInterrupt: 
    print "Interrupted by user" 
    sys.exit() 
+3

2.7.10インタラクティブなインタプリタセッション内からこの関数を呼び出して、CTRL + Cを押すだけで「ユーザによって中断されました」というメッセージが正しく表示され、終了します。私はあなたが意味するものを再現することができません... –

答えて

0

私は次のようにそれを絞られている:私のpython 2.7を使用して、コマンドライン上でそれを実行したときに

import sys 
text='' 
try: 
    print raw_input(text) 
except KeyboardInterrupt: 
    print "Interrupted by user" 
    sys.exit() 

完璧に動作します。 それは私が、コンソール上の入力を入力することができますし、私はCtrlを押しながら+を打ったとき、それは

は、編集、ユーザによってintteruptedプリントC: は、私は私があなたの例からメソッドを使用する場合しかし、それを呼び出して、最初にあなたの質問を読み違えます他のメソッドから同じ結果が返される

+1

私は他のコードをインポートしているので、私は途中にある他の割り込みハンドラをインポートしました。 – David

1

KeyboardInterruptがヒットする前に別の割り込みハンドラがスクリプトを強制終了した原因が判明しました。私はsignal.SIGINTのために私自身の割り込みハンドラを設定することで解決しました。

import sys 
import signal 
signal.signal(signal.SIGINT, signal_term_handler) 
def signal_term_handler(signal, frame): 
    '''Handles KeyboardInterrupts to ensure smooth exit''' 
    rospy.logerr('User Keyboard interrupt') 
    sys.exit(0) 

それほど直接的ではありませんが仕事が成し遂げられます。今、raw_input()は単に伝えられると死にます。

関連する問題