24

在一个旨在从 shell 运行的简单 Python 脚本中,我能否可靠地确定 sys.stdin 是否已从实际文件重定向,还是从另一个进程通过管道传输?

我想根据标准输入是来自数据文件还是来自另一个进程通过管道流式传输来更改运行时行为。

正如预期的那样,isatty()在这两种情况下都返回 False。这是一个快速isatty()测试:

# test.py
import os
import sys
print sys.stdin.isatty()
print os.isatty(sys.stdin.fileno())

测试:

python test.py < file.txt

产生:

False
False

和:

ls -al | python test.py

产生:

False
False

有没有这样做的pythonic方法?

Unix/Linux 特定的很好,但很高兴知道是否可以以可移植的方式执行此操作。

编辑:回应评论者的注意事项:我为什么要关心?好吧,就我而言,我想处理从另一个进程通过管道传输时以不规则间隔传入的带时间戳的数据;当我从文件回放预先录制的数据时,我想使用固定或可变延迟来回放它。

我同意使用更简洁的方法可能是有利的(我可以想到几种方法,包括在播放流中插入延迟的中间脚本),但我非常好奇

4

1 回答 1

28

您正在寻找stat宏:

import os, stat

mode = os.fstat(0).st_mode
if stat.S_ISFIFO(mode):
     print "stdin is piped"
elif stat.S_ISREG(mode):
     print "stdin is redirected"
else:
     print "stdin is terminal"
于 2012-11-18T18:55:08.987 回答