Может быть, кто-то из эфира может помочь мне с этим. (Я видел несколько подобных вопросов на 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 взгляните на другой из моих вопросов на в котором учтены накладные расходы подпроцесса.