2013-07-15 50 views
3

我有一個服務器在後臺運行一個線程,我使用python -i啓動它,這樣我就可以獲得一個交互式控制檯,我可以在其中鍵入命令並輕鬆進行調試。但是當我點擊Ctrl-D時,由於服務器仍在後臺線程中運行,控制檯將不會退出。如何捕獲Ctrl-D事件以便我可以關閉服務器並正常退出?我知道如何用信號捕獲Ctrl-C,但由於我按Ctrl-D的習慣,我通常會遇到一個'卡住'終端,這真的很煩人。如何在Python交互式控制檯中捕獲'Ctrl-D'?

謝謝!

服務器代碼(簡體)是這樣的:

import threading 
import atexit 

class WorkerThread(threading.Thread): 
    def __init__(self): 
     super(WorkerThread, self).__init__() 
     self.quit = False 

    def run(self): 
     while not self.quit: 
      pass 

    def stop(self): 
     self.quit = True 

def q(): 
    print "Goodbye!" 
    t.stop() 

atexit.register(q) 

t = WorkerThread() 
t.start() 

,我使用python -i test.py它得到一個python控制檯運行。

回答

8

使用raw_input(在Python 3.x中使用輸入)。按Ctrl + D將導致EOFError異常。

try: 
    raw_input() 
except EOFError: 
    pass 

UPDATE

使用atexit - Exit handlers

import atexit 

def quit_gracefully(): 
    print 'Bye' 

atexit.register(quit_gracefully) 
+0

服務器不讀取任何輸入,但使用python -i在python控制檯中運行。控制檯是爲了輸入python表達式來調試服務器。 –

+0

@ChiZhang,我更新了答案。 – falsetru

+0

我更新了代碼,但是當我點擊Ctr-D –

相關問題