2010-03-26 11 views
9

Escribo una sencilla utilidad de alarma en Python.Cómo vaciar el flujo de entrada en 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 

Quiero eliminar o descartar todas las pulsaciones de teclas que se introdujeron, mientras que el guión estaba durmiendo y sólo aceptar las pulsaciones de teclas después de la raw_input() se ejecuta.

EDITAR: Estoy ejecutando esto en Windows XP.

+2

no necesita ese punto y coma después de 'sys.stdout.flush();' –

+0

Malo, tiene razón, no necesito el punto y coma. Solucionado el código. – Amjith

+1

"¿vaciar o descartar todas las teclas"? ¿Quiere decir "Leer e Ignorar"? No puede "enjuagar" fácilmente la entrada. ¿Por qué no hacer lo simple y obvio: leerlos e ignorarlos? –

Respuesta

5

Sería de gran ayuda para saber qué sistema operativo se está utilizando, ya que esta es una pregunta muy por el sistema operativo específico. Por ejemplo, la respuesta de Kylar no funciona en Windows porque sys.stdin no tiene un atributo fileno.

tenía curiosidad, y la arrojó en conjunto una solución utilizando maldiciones, pero esto no va a funcionar en Windows, ya sea:

#!/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, Windows. Entonces puedes usar el módulo msvcrt. Tenga en cuenta que el código de abajo no es perfecto, y no funciona en reposo en el:

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

Estoy ejecutando esto en Windows XP. – Amjith

+1

Entonces puede probar el módulo msvcrt; ver la edición de arriba. –

+0

Eso funcionó. ¡Gracias! – 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

Reduje el tiempo de suspensión a 3 segundos, para realizar pruebas :) – Kylar

+0

Este código no funcionaba en Windows XP. ¿Puede explicar los diversos parámetros que está enviando a select.select()? – Amjith

+2

Ahh, no me di cuenta de que estabas en Windows. Esto no funcionará en absoluto (vi el/usr/bin/python y asumí. Mi mal.) Los documentos para seleccionar están aquí: http://docs.python.org/library/select.html pero en Windows solo se vinculará a un socket. – Kylar

5

En sistemas Unix, puede utilizar 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

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

La parte intento es para la plataforma Windows. No he probado personalmente esta parte. Pero la sección excepto funciona en la terminal de Linux. El módulo termios tiene algunas funciones de interfaz de terminal. el tcflush puede eliminar datos de entrada o salida almacenados en búfer. Esta parte definitivamente funciona en mis pruebas.

+0

¿Por qué el OP debe confiar en su respuesta? Una ** buena respuesta ** siempre tendrá una explicación de lo que se hizo y por qué se hizo de esa manera, no solo para el OP, sino también para los futuros visitantes de SO. –

+1

@bub, gracias por la pista. No creo que haya mucha explantación necesaria en este caso. editaré mi respuesta – kollery

+0

Esto es similar a lo que tuvo @Callahad. Solo envuelve en una buena 'def' – kollery

Cuestiones relacionadas