2010-03-26 5 views
9

저는 파이썬에서 간단한 알람 유틸리티를 쓰고 있습니다.파이썬에서 입력 스트림을 플러시하는 방법은 무엇입니까?

#!/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(); 뒤에 세미콜론이 필요 없다. –

+0

내 잘못이야, 네 말이 맞아, 나는 세미콜론이 필요 없어. 코드가 수정되었습니다. – Amjith

+1

"모든 키 스트로크를 플러시하거나 버립니다"? "읽기 및 무시"를 의미합니까? 입력을 쉽게 "플러시"할 수 없습니다. 단순하고 분명한 것은하지 말고 읽은 다음 무시하십시오. –

답변

5

그것은 당신이 사용중인 운영 체제를 알고 도움이 될 것이다, 이것은 매우 운영 체제 관련 질문은한다. 예를 들어 sys.stdin에 fileno 특성이 없으므로 Kylar의 대답은 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) 

편집 : 아, 윈도우. 그런 다음 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

+1

그런 다음 msvcrt 모듈을 사용해보십시오. 위의 편집을 참조하십시오. –

+0

그게 효과가있다. 고맙습니다! – 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

테스트를 위해 잠자기 시간을 3 초로 줄였습니다. – Kylar

+0

이 코드는 Windows XP에서 작동하지 않았습니다. select.select()에 보내는 다양한 매개 변수를 설명해 주시겠습니까? – Amjith

+2

아, 나는 네가 창문에 있다는 것을 몰랐다. 이것은 전혀 작동하지 않을 것입니다 (필자는/usr/bin/python을 보았고 가정했습니다.). select 용 문서는 http://docs.python.org/library/select.html에 있지만 여기에는 Windows 용입니다. 소켓에만 바인딩됩니다. – Kylar

5

, 당신은 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

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) 

try 부분은 Windows 플랫폼을위한 Rosetta Code에서. 나는이 부분을 개인적으로 테스트하지 않았다. 그러나 나머지 부분은 리눅스 터미널에서 작동합니다. termios 모듈은 일부 터미널 인터페이스 기능을 가지고 있습니다. tcflush는 입력 또는 출력 버퍼 된 데이터를 플러시 할 수 있습니다. 이 부분은 확실히 내 테스트에서 작동합니다.

+0

OP가 귀하의 답변을 왜 신뢰해야합니까? ** 좋은 답변 **에는 항상 수행 된 작업에 대한 설명이 포함되어 있으며 OP의 경우뿐만 아니라 향후 방문객을 위해 그러한 방식으로 수행 된 이유에 대해 설명합니다. –

+1

@bub, 힌트를 주셔서 감사합니다. 나는 이것에 대한 많은 explantation이 필요하다고 생각하지 않았다. 내 대답을 편집 할 것입니다 – kollery

+0

이것은 @ Callahad가 가진 것과 비슷합니다. 그냥 멋진 'def' – kollery

관련 문제