Python: 如何让命令行程序支持管道和重定向输入

管道和重定向输入的数据都是通过标准输入传入程序的, sys.stdin 这个 file-like 对象即为标准输入。 同时也可以通过 sys.stdin.isatty() 判断是否是管道和重定向输入(为 True 时表示是交互式环境, 为 False 时是我们要的场景)。

假设有个 hello.py:

import sys


def main():
    data = sys.argv[1:]
    if not sys.stdin.isatty():
        data.append(sys.stdin.read())
    return data


if __name__ == '__main__':
    data = main()
    print(' '.join(data))

测试效果:

$ echo "hello" > hello.txt
$ python hello.py hello world       # 参数输入
hello world
$ cat hello.txt | python hello.py   # 管道输入
hello

$ python hello.py < hello.txt       # 重定向输入
hello

$

Comments