2010-03-26 27 views
9

我正在用Python編寫一個簡單的報警實用程序。如何在python中刷新輸入流?

#!/usr/bin/python 

import time 
import subprocess 
import sys 

alarm1 = int(raw_input("How many minutes (alarm1)? ")) 

while (1): 
    time.sleep(60*alarm1) 
    print "Alarm1" 
    sys.stdout.flush() 
    doit = raw_input("Continue (Y/N)?[Y]: ") 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 

我要刷新或丟棄所有在腳本熟睡中輸入的擊鍵,只有後的raw_input接受擊鍵()被執行。

編輯:我在Windows XP上運行此。

+2

'sys.stdout.flush();' – 2010-03-26 04:21:39

+0

''''''''''''''''''''''''''''''我不好,你說得對,我不需要分號。修復了代碼。 – Amjith 2010-03-26 05:20:18

+1

「沖洗或丟棄所有擊鍵」?你的意思是「閱讀並忽略」你不能輕易地「沖洗」輸入。爲什麼不做簡單明顯的事情:閱讀並忽略它們? – 2010-03-26 10:15:44

回答

5

這將有助於瞭解你所使用的操作系統,因爲這是一個非常操作系統特有的問題。例如,Kylar的答案在Windows上不起作用,因爲sys.stdin沒有fileno屬性。

我很好奇,扔在一起,用詛咒的解決方案,但是這不會在Windows工作之一:

#!/usr/bin/python                

import time 
import sys 
import curses 

def alarmloop(stdscr): 
    stdscr.addstr("How many seconds (alarm1)? ") 
    curses.echo() 
    alarm1 = int(stdscr.getstr()) 
    while (1): 
     time.sleep(alarm1) 
     curses.flushinp() 
     stdscr.clear() 
     stdscr.addstr("Alarm1\n") 
     stdscr.addstr("Continue (Y/N)?[Y]:") 
     doit = stdscr.getch() 
     stdscr.addstr("\n") 
     stdscr.addstr("Input "+chr(doit)+"\n") 
     stdscr.refresh() 
     if doit == ord('N') or doit == ord('n'): 
      stdscr.addstr("Exiting.....\n") 
      break 

curses.wrapper(alarmloop) 

編輯:啊,Windows操作系統。然後你可以使用msvcrt模塊。請注意,下面的代碼是不完美的,它不會在IDLE在所有的工作:

#!/usr/bin/python 

import time 
import subprocess 
import sys 
import msvcrt 

alarm1 = int(raw_input("How many seconds (alarm1)? ")) 

while (1): 
    time.sleep(alarm1) 
    print "Alarm1" 
    sys.stdout.flush() 

    # Try to flush the buffer 
    while msvcrt.kbhit(): 
     msvcrt.getch() 

    print "Continue (Y/N)?[Y]" 
    doit = msvcrt.getch() 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 
+0

我在Windows XP中運行這個。 – Amjith 2010-03-26 05:21:25

+1

然後你可能想要嘗試msvcrt模塊;看到上面的編輯。 – 2010-03-26 05:28:39

+0

工作。謝謝! – Amjith 2010-03-27 13:37:10

1
#!/usr/bin/python 

import time 
import subprocess 
import sys 
import os, select 

alarm1 = int(raw_input("How many minutes (alarm1)? ")) 

while (1): 
    time.sleep(3*alarm1) 
    print "Alarm1" 
    sys.stdout.flush() 
    while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0: 
     os.read(sys.stdin.fileno(), 4096) 
    doit = raw_input("Continue (Y/N)?[Y]: ") 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 
+0

我將睡眠時間縮短爲3秒,用於測試:) – Kylar 2010-03-26 03:47:30

+0

此代碼在Windows XP上無法使用。你能解釋一下你發送給select.select()的各種參數嗎? – Amjith 2010-03-26 05:22:42

+2

啊,我沒意識到你在窗戶上。這根本不起作用(我看到了/ usr/bin/python並假定我的不好)。select的文檔在這裏:http://docs.python.org/library/select.html但是在windows上它將只綁定到一個套接字。 – Kylar 2010-03-26 17:35:08

5

在Unix系統中,可以使用termios.tcflush()

import time 
import subprocess 
import sys 
from termios import tcflush, TCIOFLUSH 

alarm1 = int(raw_input("How many minutes (alarm1)? ")) 

while (1): 
    time.sleep(60*alarm1) 
    print "Alarm1" 
    sys.stdout.flush(); 
    tcflush(sys.stdin, TCIOFLUSH) 
    doit = raw_input("Continue (Y/N)?[Y]: ") 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 
3

Rosetta Code

def flush_input(): 
    try: 
     import msvcrt 
     while msvcrt.kbhit(): 
      msvcrt.getch() 
    except ImportError: 
     import sys, termios #for linux/unix 
     termios.tcflush(sys.stdin, termios.TCIOFLUSH) 

的嘗試部分是針對Windows平臺。我沒有親自測試過這部分。但除了部分在linux終端上工作。 termios模塊具有一些終端接口功能。 tcflush可以刷新輸入或輸出緩衝數據。這部分絕對適用於我的測試。

+0

爲什麼OP應該相信你的答案?一個好的答案**將總是解釋所做的事情以及爲什麼這樣做,不僅是爲了OP,而且是爲了將來SO的訪問者。 – 2016-08-17 10:08:14

+1

@bub,感謝您的提示。我不認爲這一個需要很多解釋。將編輯我的答案 – kollery 2016-08-17 10:19:02

+0

這與@Callahad的相似。只是包裝在一個不錯的'def' – kollery 2016-08-17 10:25:35