在 Python 中如何从 stdin 读取数据直到管道进程终止?

In Python how do I read data from stdin until piped process terminates?

我想做这样的事情:

data = json.load(open(sys.argv[1]) if len(sys.argv) > 1 else sys.stdin)

对于这个例子可以减少到

data = json.load(sys.stdin)

但是 json.load 运行 一个 .read() 可能不包含我通过

提供的整个 JSON 字符串
generate_json_output | myprogram.py

是否有推荐的方法来读取 stdin 直到 generate_json_output 终止?我试图抓住 BrokenPipeError 但当我 运行

时它没有被提升
while True:
    data += sys.stdin.read()

代替 while 循环,您可以使用如下所示的 for 循环来迭代标准输入。

import sys

data = ''
for line in sys.stdin:
    data += line

可以写成一个表达式:

data = "".join(sys.stdin)

运行 这与使用管道生成的输入一起读取标准输入,直到它终止。

t.json:

{
    'a': 2,
    'b': 3
}

运行 cat t.json | python a.py 将完整文件打印到标准输出。