python std输入只在我想要的时候

时间:2014-11-18 01:44:04

标签: python

我有这样的代码

downloading(HUGE_FILE)

input_var = raw_input("Enter:")

但问题是当downloading()功能正在进行时,如果按下回车键, enter键插入input_var。

这不是我想要的。我希望在downloading()完成后收到输入。

1 个答案:

答案 0 :(得分:2)

在Python 2.x中没有跨平台的方法来执行此操作,因为file对象(包括stdin)基本上是围绕C stdio的最低公分母版本的瘦包装器。

但是,大多数* nix系统都有解决方案,也许适用于Windows,以及它们之间的解决方案,它涵盖了您可能运行Python终端程序的所有内容。


在大多数* nix系统上(几乎所有你可能关心的东西,只有Windows),如果你只关心交互式输入(也就是说,你想要跳过用户在提示符下键入的任何内容,但不要想要跳过任何文件或其他程序的管道输入,你可以使用termios库执行此操作:

downloading(HUGE_FILE)
if sys.stdin.isatty():
    sys.stdin.flush()
    termios.flush(sys.stdin, termios.TCIFLUSH)
    sys.stdin.flush()
input_var = raw_input("Enter:")

有些边缘情况可能无效。此外,它可以在某些平台上打破readline支持。但它主要起作用。


在Windows上,它不是那么简单 - 但如果stdin是真正的控制台输入,你可以手动排空字符,直到没有更多的字符使用Console I/O API。

downloading(HUGE_FILE)
if sys.stdin.isatty():
    sys.stdin.flush()
    while msvcrt.kbhit():
        msvcrt.getch()
    sys.stdin.flush()
input_var = raw_input("Enter:")

在这两个平台上,stdin.flush调用可能不是必需的,但理论上,在没有刷新的情况下在终端/控制台I / O和stdio I / O之间切换是非法的,在某些边缘情况下,您可能会结束已经被读入缓冲区的东西,如果你不这样做就不会被扔掉,所以,比抱歉更安全。


那么,你怎么知道你在哪个平台上?您可以检查platform.system()或类似的,但最好只检查您要使用的库(特别是因为您需要检查一大堆类Unix系统,而不是所有这些系统有termios,有些甚至可选择或仅限某个版本或......)。

try:
    import termios
    # You can use the Unix code
except ImportError:
    try:
        import msvcrt
        # You can use the Windows code
    except ImportError:
        # You can't use either, just accept the extra characters