如何检查stdin是否有一些数据?

mlz*_*boy 53 python redirect stdin stdout

在Python中,如何检查是否sys.stdin有数据?

我发现不仅os.isatty(0)可以检查stdin是否连接到TTY设备,还可以检查是否有可用的数据.

但如果有人使用像

sys.stdin = cStringIO.StringIO("ddd")
Run Code Online (Sandbox Code Playgroud)

在使用之后os.isatty(0),它仍然返回True.我需要做些什么来检查stdin是否有数据?

Rak*_*kis 66

在Unix系统上,您可以执行以下操作:

import sys
import select

if select.select([sys.stdin,],[],[],0.0)[0]:
    print "Have data!"
else:
    print "No data"
Run Code Online (Sandbox Code Playgroud)

在Windows上,select模块可能只与套接字一起使用,因此您需要使用替代机制.

  • @mlzboy:只有"真实"的文件,由操作系统打开有一个文件描述符编号(在Unix套接字或管道上的btw也是文件).调用操作系统选择功能的`select`只能用于那些文件.`StringIO`是一个只有Python解释器才知道的虚拟文件,因此它没有文件描述符,你不能在它上面使用`select`. (2认同)
  • @mlzboy管道的缓冲区大小有限.写入没有任何内容读取的管道是危险的,因为如果您尝试写入超过缓冲区大小,它将阻塞(死锁). (2认同)

lia*_*ang 53

我一直在用

if not sys.stdin.isatty()
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

4 import sys
5
6 def main():
7     if not sys.stdin.isatty():
8         print "not sys.stdin.isatty"
9     else:
10         print "is  sys.stdin.isatty"

>echo "asdf" | stdin.py
not sys.stdin.isatty
Run Code Online (Sandbox Code Playgroud)

如果stdin中存在某些内容,则sys.stdin.isatty()返回false.

isatty(...)
    isatty() -> true or false. True if the file is connected to a tty device.
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个好主意.如果stdin从文件中传入怎么办?isatty()告诉你stdin是否直接从终端进入,而不是从stdin读取更多数据 (18认同)
  • 谢谢!这比使用`select`容易得多. (3认同)
  • 因为在另一篇文章中提到了 `grep`,我会提到 `less` 使用 `isatty`。我来这里是为了做类似“less”的事情:如果文件路径作为输入参数给出,则从文件读取输入,否则从标准输入读取输入。另一种方法是使用 `-` 作为 stdin 的别名并只接受文件参数。 (2认同)