Интерпретировать вывод из bash в модуль подпроцесса Python - PullRequest
0 голосов
/ 25 декабря 2018

Я просматривал примеры модулей subprocess на PYMOPTW Дуга Хелманна.Вот фрагмент кода, с которым у меня проблемы.

# subprocess_run_output_error.py
import subprocess

try:
    completed = subprocess.run(
        'echo to stdout; echo to stderr 1>&2; exit 1',
        check=True,
        shell=True,
        stdout=subprocess.PIPE,
    )
except subprocess.CalledProcessError as err:
    print('ERROR:', err)
else:
    print('returncode:', completed.returncode)
    print('Have {} bytes in stdout: {!r}'.format(
        len(completed.stdout),
        completed.stdout.decode('utf-8'))
    )

Я понимаю, что exit 1 должен выдать ошибку, и выполняется условие исключение.

to stderr 
ERROR: Command 'echo to stdout; echo to stderr 1>&2; exit 1' returned non-zero exit status 1.

Не понимаю, почему to stdout не печатается, а to stderr.1>&2 не появляется после запуска echo to stdout?

Для лучшего понимания я изменил код, чтобы посмотреть, смогу ли я запустить часть else, поэтому я переключил ее на exit 0,Когда я это сделал, я получил вывод:

to stderr
returncode: 0
Have 10 bytes in stdout: 'to stdout\n'

Я не понимаю, что означает 1>2, несмотря на переход к шпаргалкам .

  1. Снова to stderr было напечатано.Почему to stdout не распечатывается первым, так как он появился первым?

  2. Почему объект CompletedProcess только удерживает to stderr, а не to stdout?

  3. Если я понимаю часть шпаргалки ниже, почему to stderr не отправляется в стандартный поток ошибок, если его дескриптор файла 2?

n> & m # дескриптор файла n создан как копия дескриптора выходного файла

Другой вопрос, который я нашел относительно близко, был this .Тем не менее, он сравнивал &> и >&.Я не мог понять смысл начального >&, поэтому чувствовал себя еще более смущенным.

1 Ответ

0 голосов
/ 25 декабря 2018
  1. Поскольку вы захватили его, у вас есть его в наличии на completed.stdout.
  2. Поскольку вы захватили только стандартный вывод: stdout=subprocess.PIPE, но не stderr=subprocess.PIPE
  3. Этона самом деле отправляется в stderr, поэтому печатается в начале, потому что вы не захватили его, и этот поток не буферизован.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...