Я просматривал примеры модулей 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
, несмотря на переход к шпаргалкам .
Снова to stderr
было напечатано.Почему to stdout
не распечатывается первым, так как он появился первым?
Почему объект CompletedProcess
только удерживает to stderr
, а не to stdout
?
- Если я понимаю часть шпаргалки ниже, почему
to stderr
не отправляется в стандартный поток ошибок, если его дескриптор файла 2
?
n> & m # дескриптор файла n создан как копия дескриптора выходного файла
Другой вопрос, который я нашел относительно близко, был this .Тем не менее, он сравнивал &>
и >&
.Я не мог понять смысл начального >&
, поэтому чувствовал себя еще более смущенным.