【问题标题】:Is there a way for a python script to "know" if it is being piped to?有没有办法让 python 脚本“知道”它是否被传送到?
【发布时间】:2016-02-06 23:30:27
【问题描述】:

myscript.py

import sys
if something_to_read_from_stdin_aka_piped_to:
    cmd = sys.stdin.read()
    print(cmd)
else:
    print("standard behavior")

Bash 示例:

echo "test" | python myscript.py

如果没有通过管道传输,它将挂起。

知道脚本是否应该从标准输入读取的方法是什么;我希望除了脚本的命令行参数之外还有一些明显的东西。

【问题讨论】:

  • @dan1111 不重要。用一些伪代码更新了示例。
  • 这只是需要记录的东西。

标签: python pipe


【解决方案1】:

是的,很有可能,我已经修改了你的例子来实现这一点。

import sys
import os
if not os.isatty(0):
    cmd = sys.stdin.read()
    print(cmd)
else:
    print("standard behavior")

我们知道 0 是程序输入的文件描述符。 isatty 是检查文件描述符是否引用终端的测试。 正如其他用户所指出的,上述方法将判断程序是否正在从终端读取。然而,上面的编程解决了问题的目的,但仍有改进的空间。我们可以有另一种解决方案,它只检测程序是否正在从管道读取。

import sys
import os
from stat import S_ISFIFO

if S_ISFIFO(os.fstat(0).st_mode):
    print("Reading from pipe")
    cmd = sys.stdin.read()
    print(cmd)
else:
    print("not reading from pipe")

【讨论】:

  • 我认为测试是“if not os.isatty(0)”,但确实如此!
  • 这并没有检测到程序从管道读取;它检测到它是否正在从终端读取。 echo foo | scriptscript < foo 都会有 os.isatty(0) 返回 False
  • @chepner 我已经用新代码编辑了我的答案,该代码将检测程序是否正在从管道读取。
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多