Может быть, есть кто-то в эфире, который может помочь мне с этим.(Я видел несколько подобных вопросов в SO, но ни один из них не касается как стандартной ошибки, так и стандартной ошибки, так и не имеет отношения к ситуации, похожей на мою, поэтому этот новый вопрос.)
У меня есть функция pythonкоторый открывает подпроцесс, ожидает его завершения, затем выводит код возврата, а также содержимое стандартного выхода и стандартных каналов ошибок.Пока процесс запущен, я хотел бы также отображать вывод обоих каналов по мере их заполнения.Моя первая попытка привела к чему-то вроде этого:
process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = str()
stderr = str()
returnCode = None
while True:
# collect return code and pipe info
stdoutPiece = process.stdout.read()
stdout = stdout + stdoutPiece
stderrPiece = process.stderr.read()
stderr = stderr + stderrPiece
returnCode = process.poll()
# check for the end of pipes and return code
if stdoutPiece == '' and stderrPiece == '' and returnCode != None:
return returnCode, stdout, stderr
if stdoutPiece != '': print(stdoutPiece)
if stderrPiece != '': print(stderrPiece)
Хотя есть пара проблем с этим.Поскольку read()
читает до EOF
, первая строка цикла while
не вернется, пока подпроцесс не закроет канал.
Я мог бы заменить read()
в пользу read(int)
, нонапечатанный вывод искажается, обрезается в конце прочитанных символов.Я мог бы readline()
в качестве замены, но печатный вывод искажается чередующимися строками и ошибками, когда есть много и того, и другого одновременно.
Возможно, есть вариант read-until-end-of-buffer()
, который яне в курсе?Или, может быть, это может быть реализовано?
Может быть, лучше всего реализовать оболочку sys.stdout
, как предложено в этом ответе на другой пост ?Однако я хотел бы использовать обертку только в этой функции.
Любые другие идеи от сообщества?
Я ценю помощь!:)
EDIT : Решение действительно должно быть кросс-платформенным, но если у вас есть идеи, которых нет, пожалуйста, поделитесь ими, чтобы продолжить мозговой штурм.
Что касается еще одного из моих скриптеров головы подпроцесса python, взгляните на еще один из моих вопросов о учете накладных расходов подпроцесса во времени .