Una lectura detallada del source code da la respuesta. En particular, el documentation es engañosa cuando dice:
subprocess.STDOUT
valor especial que (...) indica que el error estándar debe entrar en el mismo mango como salida estándar.
Desde stdout se establece en "default" (-1
, técnicamente) cuando se evalúa stderr=subprocess.STDOUT
, stderr está ajustado en "default" también. Desafortunadamente, esto significa que la salida de stderr todavía va a stderr.
Para resolver el problema, pase en el archivo de salida estándar en lugar de subprocess.STDOUT
:
$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
stderr=sys.stdout.buffer)'
O, para la compatibilidad con versiones 2.x legado de Python:
$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
stderr=sys.stdout.fileno())'
Por cierto, está arreglado en python 3.5. – max