Фильтрующий stderr подпроцесса захватывает пустые байты - PullRequest
0 голосов
/ 30 мая 2019

Я вызываю очень шумную команду CLI и хочу отфильтровать вывод, предположительно, stderr. Вывод двоичного файла CLI формируется как регистрация Python, INFO:… или WARNING:…. При запуске в оболочке команда CLI сначала имеет несколько журналов «установки», а через несколько секунд запускаются реальные журналы с несколькими десятками в секунду.

Я пытался ТРУБИТЬ stderr и, конечно, также стандартный вывод процесса, подобного этому:

process = subprocess.Popen(cmd, 
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE)

    while process.stderr:
        line = process.stderr.readline()
        print("STDERR", line)

    while process.stdout:
        line = process.stdout.readline()
        print("STDOUT", line)

Это работает, и отпечатки STDERR появляются для первых битов выполнения команды CLI. Однако, когда я добираюсь до детали через несколько секунд, вывод из моих распечаток STDERR будет только b'' - возможно, на той же частоте, что и при обычном вызове оболочки, будут выводиться дополнительные журналы. Я также пробовал read() вместо readline(), но безрезультатно. (Кстати, «STDOUT» никогда не вызывается)

Каким-то образом выходные данные, которые регистрируются при обычном вызове оболочки, отличаются или слишком часты (?) Или неполны (?) Для PIPE, чтобы передать его, прочитать и правильно распечатать.

Что я мог сделать, чтобы отладить это дальше?

1 Ответ

1 голос
/ 30 мая 2019

Можно заменить циклы while на:

for line in iter(process.stderr.readline, b''):
    print("STDERR", line)

Это, по крайней мере, связано с тем фактом, что process.stderr никогда не станет ложным, даже когда нечего читать.

...