Вам необходимо очистить модуль записи данных в дескриптор stderr
:
sys.stderr.write("--Hello\n")
sys.stderr.flush()
stdio - это буферизация строки при подключении к терминалу и использование фиксированного буфера при подключении ктруба.Вы пишете \n
символ новой строки, который вызывает сброс при подключении к терминалу, но без этого для каждой строки вы не пишете достаточно в stderr
, чтобы вызвать сброс буфера перед окончательным сбросом при выходе из Python.
Если вы используете print(..., file=sys.stderr)
, вы можете указать print()
, чтобы выполнить вызов flush()
, добавив flush=True
:
print("--Hello", file=sys.stderr, flush=True)
Другой способ справиться с этим -перехватить и освободить вывод stderr дочернего процесса:
sys.stderr.write("--Hello\n")
try:
subprocess.check_call("ls *.foobar", shell=True, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as e:
sys.stderr.write(e.stderr)
sys.stderr.write("Command failed\n")
sys.stderr.write("--Bye\n")
Добавление stderr=subprocess.PIPE
сообщает subprocess
о захвате вывода команды stderr, и вы можете найти этот вывод как e.stderr
атрибут исключения CalledProcessError
.