Вы неправильно понимаете, как работают подпроцессы.Подпроцесс не взаимодействует с объектом sys.stdout
- этот объект существует только в python и только в вашем процессе.
Чтобы понять, что на самом деле происходит, вам сначала нужно знать, какОС обрабатывает IO.На уровне операционной системы каждому открытому файлу (или каналу) присваивается идентификатор - он называется дескриптор файла .Например, дескриптор для stdout
обычно является числом 1
:
>>> sys.stdout.fileno()
1
Когда вы запускаете подпроцесс, только этот дескриптор файла передается подпроцессу.Подпроцесс не имеет доступ к объекту sys.stdout
.Все, что может сделать подпроцесс, - это записать байты в обработчик файла, который он получил.(На уровне ОС есть только байты, без текста.) Вы не можете заставить подпроцесс использовать определенную кодировку.
Когда вы передаете аргумент encoding
в subprocess.run
, эта кодировка толькоиспользуется для кодирования текста, отправляемого в подпроцесс или получаемого из подпроцесса.Он не влияет на сам подпроцесс, он влияет только на то, как ваш процесс взаимодействует с подпроцессом.