Расширение решения Magnus Skog (+1, кстати, :)):
Ну, в общем, получается, что, когда подпроцесс будет форкировать новый процесс, он будет дублировать аргумент stdout на новый stdout подпроцесса (fileno =1) используя os.dup2 (посмотрите на subprocess.Popen._execute_child ), и это сохранит небуферизованное состояние (как делает dup2), все до сих пор хорошо, но когда будет запущен python (вподпроцесс) по умолчанию, если python не видит флаг -u, он установит буфер stdout в строковый буфер (взгляните на основную функцию python .), которая переопределит установленный вами флаг буферизациидо того.
Надеюсь, это объяснит больше поведение, которое вы видели.