我有这样的代码
downloading(HUGE_FILE)
input_var = raw_input("Enter:")
但问题是当downloading()
功能正在进行时,如果按下回车键,
enter键插入input_var。
这不是我想要的。我希望在downloading()
完成后收到输入。
答案 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