代码之家  ›  专栏  ›  技术社区  ›  Amjith

如何在python中刷新输入流?

  •  11
  • Amjith  · 技术社区  · 15 年前

    我正在用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
    

    我想刷新或放弃脚本休眠时输入的所有键笔画,只接受执行原始输入()后的键笔画。

    编辑:我在Windows XP上运行这个。

    4 回复  |  直到 7 年前
        1
  •  10
  •   Peter Milley    15 年前

    这将有助于了解您正在使用的操作系统,因为这是一个非常特定于操作系统的问题。例如,因为sys.stdin没有fileno属性,所以kylar的答案在Windows上不起作用。

    我很好奇,想出了一个用诅咒来解决问题的方法,但这在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模块。请注意,下面的代码并不完美,而且完全不能在空闲状态下工作:

    #!/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
    
        2
  •  6
  •   Callahad    15 年前

    在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
  •  6
  •   hyper-neutrino    8 年前

    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)
    

    Try部分用于Windows平台。我没有亲自测试过这部分。但是except部分在Linux终端上工作。Termios模块具有一些终端接口功能。tcflush可以刷新输入或输出缓冲数据。这部分在我的测试中肯定有效。

        4
  •  2
  •   ShadowRanger    7 年前
    #!/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 select.select([sys.stdin.fileno()], [], [], 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