Dokładne przeczytanie source code daje odpowiedź. W szczególności documentation jest mylące, gdy mówi:
subprocess.STDOUT
wartość specjalna, że (...) wskazuje, że błąd standardowy powinien iść do tego samego uchwytem jako standardowe wyjście.
Od stdout jest ustawiony na "default" (-1
technicznie), gdy stderr=subprocess.STDOUT
ocenia, stderr jest ustawiony na "default", jak również. Niestety oznacza to, że wyjście stderr nadal idzie na stderr.
Aby rozwiązać ten problem, należy przejść do pliku stdout zamiast subprocess.STDOUT
:
$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
stderr=sys.stdout.buffer)'
Albo, dla kompatybilności z wersjami dziedzictwo 2.x Pythona:
$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
stderr=sys.stdout.fileno())'
BTW, naprawiono to w pythonie 3.5. – max