В Python как мне прочитать данные из стандартного ввода, пока не завершится конвейерный процесс? - PullRequest
0 голосов
/ 31 января 2020

Я хотел бы сделать что-то вроде этого:

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

1 Ответ

1 голос
/ 31 января 2020

Вместо while l oop вы можете использовать для l oop, как показано ниже, для итерации по стандартному стандартному вводу.

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 выводит полный файл в стандартный вывод.

...