【问题标题】:python std input only when I wantpython std 仅在我需要时输入
【发布时间】:2015-01-15 02:28:58
【问题描述】:

我有这样的代码

downloading(HUGE_FILE)

input_var = raw_input("Enter:")

但问题是在downloading() 函数正在进行时,如果我按回车键, 插入到 input_var 的回车键。

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

【问题讨论】:

  • 按键被操作系统缓冲。在要求输入之前,您需要设计一些方法来立即刷新标准输入。 See also
  • 如果是异步过程,为什么不输入一个暂停直到下载完成?
  • 听起来你需要阻塞直到 downloading() 完成,或者有一个繁忙的循环来检查 downloading() 是否完成。这是否可能取决于downloading() 内部发生的情况,所以你能告诉我们你是如何进行下载的吗?
  • 谢谢大家的评论。我会尝试所有这些

标签: python


【解决方案1】:

在 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 的系统,但并不是所有的系统都有 @ 987654333@,有些甚至可以选择或仅在某个版本或...)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多