2010-03-26 13 views
9

Ich schreibe ein einfaches Alarm-Dienstprogramm in Python.Wie spült man den Eingabestrom in 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 

Ich möchte spülen oder alle Tastenanschläge zu verwerfen, die eingegeben wurden, während das Skript schlief und nur die Tastenanschläge nach dem raw_input accept() ausgeführt wird.

EDIT: Ich führe dies auf Windows XP.

+2

Sie brauchen nicht das Semikolon nach 'sys.stdout.flush();' –

+0

Mein schlechtes, Sie haben Recht, ich brauche nicht das Semikolon. Der Code wurde korrigiert. – Amjith

+1

"Alle Tasten streichen oder verwerfen"? Meinst du "Lesen und Ignorieren" Sie können Eingaben nicht einfach "spülen". Warum nicht das Einfache, Offensichtliche: Lies sie und ignoriere sie? –

Antwort

5

Es würde helfen, zu wissen, welches Betriebssystem Sie verwenden, da dies ein sehr betriebssystemspezifische Frage. Zum Beispiel funktioniert Kylars Antwort unter Windows nicht, da sys.stdin kein fileno-Attribut besitzt.

Ich war neugierig und warf zusammen eine Lösung Flüche verwenden, aber dies wird nicht funktionieren unter Windows entweder:

#!/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) 

EDIT: ah, Fenster. Dann können Sie das msvcrt-Modul verwenden. Beachten Sie, dass der folgende Code ist nicht perfekt, und es funktioniert nicht in IDLE überhaupt:

#!/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

Ich führe das in Windows XP. – Amjith

+1

Dann möchten Sie vielleicht das msvcrt-Modul ausprobieren; siehe oben. –

+0

Das hat funktioniert. Vielen Dank! – Amjith

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

Ich habe Ihre Ruhezeit zum Testen auf 3 Sekunden reduziert :) – Kylar

+0

Dieser Code funktionierte unter Windows XP nicht. Können Sie bitte die verschiedenen Parameter erklären, die Sie an select.select() senden? – Amjith

+2

Ahh, ich wusste nicht, dass du auf Windows warst. Dies wird überhaupt nicht funktionieren (ich sah das/usr/bin/python und angenommen. Meine schlechte.) Die Dokumente für die Auswahl sind hier: http://docs.python.org/library/select.html aber auf Windows es bindet nur an einen Socket. – Kylar

5

Auf Unices können Sie termios.tcflush() verwenden:

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

Von 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) 

Der try Teil ist für Windows-Plattform. Ich habe diesen Teil nicht persönlich getestet. Aber der Abschnitt "except" funktioniert auf dem Linux-Terminal. Das Terminalmodul hat einige Funktionen der Terminalschnittstelle. Die tcflush kann gepufferte Daten ein- oder ausgeben. Dieser Teil funktioniert definitiv in meinen Tests.

+0

Warum sollte das OP Ihrer Antwort vertrauen? Eine ** gute Antwort ** wird immer eine Erklärung haben, was getan wurde und warum es so gemacht wurde, nicht nur für das OP, sondern auch für zukünftige Besucher von SO. –

+1

@bub, danke für den Hinweis. Ich glaube nicht, dass hier viel Explantation nötig ist. wird meine Antwort bearbeiten – kollery

+0

Dies ist ähnlich wie @ Callahad hatte. Wickelt einfach ein schönes "def" – kollery

Verwandte Themen