在Python中,如何检查是否sys.stdin
有数据?
我发现不仅os.isatty(0)
可以检查stdin是否已连接到TTY设备,还可以检查是否有可用数据。
但是如果有人使用诸如
sys.stdin = cStringIO.StringIO("ddd")
然后使用os.isatty(0)
,它仍然返回True。我需要做什么检查stdin是否有数据?
在Python中,如何检查是否sys.stdin
有数据?
我发现不仅os.isatty(0)
可以检查stdin是否已连接到TTY设备,还可以检查是否有可用数据。
但是如果有人使用诸如
sys.stdin = cStringIO.StringIO("ddd")
然后使用os.isatty(0)
,它仍然返回True。我需要做什么检查stdin是否有数据?
os.isatty(0)
检查与文件描述符(fd)0关联的文件是否为TTY。更改sys.stdin
变量时,不会更改与fd0关联的文件。fd0仍指向原始stdin(在您的情况下为TTY)。
cStringIO.StringIO("ddd")
阻止阅读;它始终具有可用数据,当然达到EOF时除外。
Answers:
在Unix系统上,您可以执行以下操作:
import sys
import select
if select.select([sys.stdin,],[],[],0.0)[0]:
print "Have data!"
else:
print "No data"
在Windows上,虽然select模块只能与套接字一起使用,所以您需要使用其他机制。
select
调用操作系统的选择功能的文件只能与这些文件一起使用。StringIO
是仅Python解释器已知的虚拟文件,因此它没有文件描述符,因此无法select
在其上使用。
sys.stdin.isatty()
但是确实在cron中为我工作。
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
,而不是[]
我一直在用
if not sys.stdin.isatty()
这是一个例子:
import sys
def main():
if not sys.stdin.isatty():
print "not sys.stdin.isatty"
else:
print "is sys.stdin.isatty"
跑步
$ echo "asdf" | stdin.py
not sys.stdin.isatty
sys.stdin.isatty()
如果中包含,则返回false stdin
。
isatty(...)
isatty() -> true or false. True if the file is connected to a tty device.
select
。
grep
在另一篇文章中提到,我会提到less
用途isatty
。我来这里的目的是想做些什么less
:如果将文件路径作为输入参数给出,则从文件中读取输入,否则从stdin中读取输入。一种替代方法是-
用作stdin的别名,并只接受file参数。
根据此处的目标:
import fileinput
for line in fileinput.input():
do_something(line)
也可能有用。
(编辑:这回答了一个相关的问题,此问题已在此处合并。)
就像其他人提到的那样,没有万无一失的方法来知道是否可以从stdin获得数据,因为UNIX不允许这样做(更普遍的是,因为它无法猜测stdin连接到的任何程序的未来行为)。
始终等待标准输入,即使可能什么也没做(就是这样做grep
等等),或要求用户提供-
参数。
printf "" | cat
或while read l; do true; done; echo finishing
(在第二种情况下,您必须手动输入EOF / ^ D才能通过)
cat
在命令行上输入例如,它将无限期地等待输入。在上面的示例中,printf发送EOF