2016-03-24 82 views
0

我有一段python代碼來嘗試使raw_input捕獲鍵盤中斷。如果我在這個函數中運行代碼,它可以很好地工作。但是如果我在程序中運行它,打印語句永遠不會生成,表明鍵盤中斷沒有被捕獲。該程序試圖退出並失敗,直到它升級到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

我已經把範圍縮小到以下幾點:

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

這完美的作品時,我使用python 2.7在命令行中運行它。 它讓我鍵入控制檯上輸入,當我按ctrl + c將其打印由用戶intterupted

編輯: 我誤解你的問題在第一,但是當我使用的方法從你的榜樣,並調用它從另一種方法結果是相同的

+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()將在告訴時簡單地死亡。