在 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