2010-03-26 17 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 के बाद की स्ट्रोक स्वीकार निष्पादित किया जाता है चाहता हूँ।

संपादित करें: मैं इसे विंडोज एक्सपी पर चला रहा हूं।

+2

आपको sys.stdout.flush() के बाद उस अर्धविराम की आवश्यकता नहीं है; ' –

+0

मेरा बुरा, आप सही हैं, मुझे सेमी-कोलन की आवश्यकता नहीं है। कोड फिक्स्ड – Amjith

+1

"सभी प्रमुख स्ट्रोक फ्लश या त्यागें"? क्या आपका मतलब है "पढ़ें और अनदेखा करें" आप आसानी से "फ्लश" इनपुट नहीं कर सकते हैं। सरल, स्पष्ट चीज़ क्यों न करें: उन्हें पढ़ें और उन्हें अनदेखा करें? –

उत्तर

5

यह पता है कि ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं करने के लिए मदद मिलेगी, के रूप में यह एक बहुत ही ऑपरेटिंग सिस्टम विशिष्ट सवाल है। उदाहरण के लिए, काइलर का जवाब विंडोज पर काम नहीं करता है क्योंकि sys.stdin में फिलेनो विशेषता नहीं है।

मैं उत्सुक था और साथ में एक समाधान शाप का उपयोग कर फेंक दिया, लेकिन इस विंडोज या तो पर काम नहीं करेगा:

#!/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 मॉड्यूल का उपयोग कर सकते हैं। ध्यान दें कि नीचे कोड सही नहीं है, और यह सब पर निष्क्रिय में काम नहीं करता:

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

मैं इसे विंडोज एक्सपी में चला रहा हूं। – 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

यह कोड विंडोज एक्सपी पर काम नहीं करता है। क्या आप कृपया चयन कर रहे विभिन्न पैरामीटर को समझा सकते हैं। चयन()? – Amjith

+2

आह, मुझे नहीं पता था कि आप खिड़कियों पर थे। यह बिल्कुल काम नहीं करेगा (मैंने/usr/bin/python देखा और माना। मेरा बुरा।) चयन के लिए दस्तावेज़ यहां हैं: http://docs.python.org/library/select.html लेकिन विंडोज़ पर केवल एक सॉकेट से बंधेगा। – Kylar

5

Unices पर, आप 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) 

कोशिश हिस्सा विंडोज प्लेटफॉर्म के लिए है। मैंने व्यक्तिगत रूप से इस भाग का परीक्षण नहीं किया है। लेकिन छोड़कर अनुभाग लिनक्स टर्मिनल पर काम करता है। टर्मियो मॉड्यूल में कुछ टर्मिनल इंटरफ़ेस फ़ंक्शन हैं। tcflush इनपुट या आउटपुट buffered डेटा फ्लश कर सकते हैं। यह हिस्सा निश्चित रूप से मेरे परीक्षणों में काम करता है।

+0

ओपी को आपके उत्तर पर भरोसा क्यों करना चाहिए? एक ** अच्छा उत्तर ** हमेशा क्या किया गया था इसका एक स्पष्टीकरण होगा और यह ओपी के लिए क्यों नहीं बल्कि भविष्य के आगंतुकों के लिए ऐसा किया गया था। –

+1

@bub, संकेत के लिए धन्यवाद। मुझे नहीं लगता था कि इस पर बहुत अधिक स्पष्टीकरण की आवश्यकता है। मेरा जवाब संपादित करेगा – kollery

+0

यह @ कल्लाहद के समान था। बस एक अच्छा 'def' में लपेटता है – kollery

संबंधित मुद्दे