Python - stdin - 如何识别输入源?

5
我正在寻找一种方法来确定输入是否来自另一个应用程序的管道。假设我有一个程序,它可以从管道输入数据(当您从其他应用程序 - grep、tail等中进行管道处理时),或者使用默认数据文件。我不希望用户在提示时手动填写数据,因为没有stdin被管道处理。下面是一个简单的代码示例:
from sys import stdin

for line in stdin:
    print line

当我使用以下代码运行脚本时:
echo "data" | python example.py

我明白了

data

脚本结束。

如果我以下列方式运行脚本,则:

python example.py

它提示用户填写输入并等待。

因此,我正在寻找以下内容,以避免在没有数据管道时出现提示:

from sys import stdin

if is_stdin_piped():
    for line in stdin:
        print line
else:
    print "default"

这种情况是否可能?谢谢。
1个回答

4

如果您使用输入重定向,则标准输入不像通常那样连接到终端。您可以使用isatty函数检查文件描述符是否连接到终端:

import os

def is_stdin_piped():
    return not os.isatty(0)

为了更安全,使用 sys.stdin.fileno() 替代 0

更新:要检查 stdin 是否被重定向到文件(而不是另一个程序,例如 IDE 或 shell 管道),可以使用 fstat

import os, stat

def is_stdin_a_file():
    status = os.fstat(0)
    return stat.S_ISREG(status.st_mode)

它看起来很好,几乎满足我的需求。当我从命令行运行它时,一切都正常工作。然而,当我在PyDev IDE中运行它(因此没有管道),is_stdin_piped()返回的是已经被管道化了。有什么办法可以解决这个问题吗?谢谢。 - Marek
你的集成开发环境在你不知道的情况下使用了管道。但等等 - 有一种方法可以检查输入是否来自文件重定向。 - Joni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接