代码之家  ›  专栏  ›  技术社区  ›  PascalVKooten

python脚本有没有办法“知道”它是否被管道传输到?

  •  10
  • PascalVKooten  · 技术社区  · 9 年前

    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
    

    如果没有管道连接到,它将挂起。

    知道脚本是否应该从stdin读取的方法是什么;我希望除了脚本的命令行参数之外,还有其他明显的东西。

    1 回复  |  直到 9 年前
        1
  •  13
  •   AlokThakur    9 年前

    是的,这是非常有可能的,我已经修改了您的示例来实现这一点。

    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")