如何从python中的stdin缓冲区读取所有内容而不会阻塞?我没有发现任何堆栈溢出解决方案,因为我的stdin是非交互式的。
tcflush(sys.stdin, TCIOFLUSH)
在非交互式标准输入上不起作用。
while select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []):
sys.stdin.read(1)
和
while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0:
os.read(sys.stdin.fileno(), 4096)
哪个不起作用,因为while
头部的状态始终是False
。
还有其他想法吗?
更准确地说:
我的代码应该
因此,它永远不会阻塞。
到目前为止,感谢您的建议。毕竟,这显然是那些奇怪的并发问题之一。
当我在select
通话中设置超时时,它可以工作。因此,在我调用时,缓冲区似乎真的还没有被填充select
。
不起作用(与问题相同):
while select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []):
sys.stdin.read(1)
起作用:
while select.select([sys.stdin], [], [], 0.01) == ([sys.stdin], [], []):
sys.stdin.read(1)
因为我要读取的内容是基于行的,所以我可以一次使用读取整行,input
而不是read
使用while读取单个字符,因此while循环中的超时减慢不会引起注意。(缓冲区中最多有5-10行)。
我对这种解决方案并不完全满意,因为它涉及等待任意时间(0.01
总是足够吗?)。但另一方面,由于无法影响编写到“我的stdin”的代码,我现在无法想到更好的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句