【问题标题】:How clear stdin in PythonPython中的标准输入如何清晰
【发布时间】:2021-01-17 23:03:04
【问题描述】:

我想知道输入某个键后是否可以清除标准输入。 在这个论坛的回复之后,我正在做一个输入超时:

 while True:
    web_scrapping()    
    print ("Press ENTER: \n")
    time.sleep(interval)
    i, o, e = select.select( [sys.stdin], [], [], 10 )
    if (i):
        Start()

如果工作正常,请检查是否按下了某个按键,如果确实按下了函数,则转到函数 Start()。 但是我的问题是Start()中也有输入题,所以While True中的前一个击键也传递到Start()中,所以结果是Start()中的输入问题因为前一个击键而显示了两次。 所以我想在开始()之前清除那个击键。那可能吗? 谢谢

【问题讨论】:

  • 调用一次raw_input 来清除缓冲区怎么样?还不够好吗?
  • Uriya,这个解决方法对我没有用。

标签: python select input


【解决方案1】:

这很好,我相信如果您在 UNIX 系统上工作,您应该能够在使用termios 调用input 之前清除stdin 中的所有排队数据。试试这样的:

from termios import tcflush, TCIFLUSH

while True:
    web_scrapping()    
    print ("Press ENTER: \n")
    time.sleep(interval)
    i, o, e = select.select( [sys.stdin], [], [], 10 )
    if (i):
        # Clear queue before asking for new input
        tcflush(sys.stdin, TCIFLUSH)
        Start()

这应该可以在调用Start 时创建一个新队列。注释下面示例中的第 13 行将调用 input 在调用时提交在队列中找到的任何内容。在调用之前刷新队列有助于避免这种行为:

import select
import sys
import time
from termios import TCIFLUSH, tcflush

while True:
    print("Pretend I'm doing some stuff")
    time.sleep(2)
    i, o, e = select.select([sys.stdin], [], [], 2)
    # Enters if anything has been submitted
    if i:
        # Clear queue before asking for new input
        #   commenting it will submit whathever data is queued to stdin
        tcflush(sys.stdin, TCIFLUSH)
        a = input("Echo: ")
        print(f"your input is: {a}")
        break
    else:
        print("Nothing found in stdin")

【讨论】:

  • 谢谢anddt,TCIFLUSH 为我工作。正是我需要的。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多