有没有办法让python脚本"知道"它是否被管道传输?

Pas*_*ten 8 python pipe

myscript.py

import sys
if something_to_read_from_stdin_aka_piped_to:
    cmd = sys.stdin.read()
    print(cmd)
else:
    print("standard behavior")
Run Code Online (Sandbox Code Playgroud)

Bash示例:

echo "test" | python myscript.py
Run Code Online (Sandbox Code Playgroud)

如果它没有被管道传输,它就会挂起.

知道脚本应该或不应该从stdin读取的方法是什么?我希望除了脚本的命令行参数之外还有一些明显的东西.

Alo*_*kur 10

是的,这是非常可能的,我已经修改了你的例子来实现这一点.

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

我们知道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")
Run Code Online (Sandbox Code Playgroud)