我正在寻找一种方法来确定stdin输入是否通过管道来自另一个应用程序。
假设我有一个程序,它要么接受来自管道 stdin 的输入数据(当您从另一个应用程序 - grep、tail 等管道输入数据时),要么使用默认数据文件。我不希望用户在出现提示时手动填写数据,因为没有管道标准输入。
我的简单代码示例如下所示:
from sys import stdin
for line in stdin:
print line
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令运行脚本时:
echo "data" | python example.py
Run Code Online (Sandbox Code Playgroud)
我明白了
data
Run Code Online (Sandbox Code Playgroud)
脚本结束。
如果我按以下方式运行脚本,
python example.py
Run Code Online (Sandbox Code Playgroud)
它提示用户填写输入并等待。
因此,我正在寻找类似以下内容的内容,以避免在没有数据通过管道传输时出现提示。
from sys import stdin
if is_stdin_piped():
for line in stdin:
print line
else:
print "default"
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?谢谢
如果您使用输入重定向,标准输入不会像通常那样连接到终端。您可以使用以下函数检查文件描述符是否连接到终端isatty:
import os
def is_stdin_piped():
return not os.isatty(0)
Run Code Online (Sandbox Code Playgroud)
为了额外的安全性,请使用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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |