Перенаправить stderr в стандартный вывод в исполняемом процессе из python?

StackOverflow https://stackoverflow.com/questions/2309911

Вопрос

В bash-скрипте я могу написать:

exec 2>&1
exec someprog

И вывод stderr из someprog будет перенаправлен на стандартный вывод.

Есть ли какой-нибудь способ сделать подобное, используя python os.exec* функции?

Это не обязательно должно быть переносимым, просто работайте в Linux.

Это было полезно?

Решение

os.dup2(1, 2)

Наглядные примеры

Давайте выполним /bin/ls с фиктивным аргументом, так что он жалуется в stderr.

$ python -c "import os; os.execl('/bin/ls', '', 'ffweew')" 1>/dev/null
: ffweew: No such file or directory
$ python -c "import os; os.execl('/bin/ls', '', 'ffweew')" 2>/dev/null
$ python -c "import os; os.dup2(1, 2); os.execl('/bin/ls', '', 'ffweew')" 1>/dev/null
$ python -c "import os; os.dup2(1, 2); os.execl('/bin/ls', '', 'ffweew')" 2>/dev/null
: ffweew: No such file or directory
$ 

Первые два вызова доказывают , что ls не записывает в стандартный вывод, а записывает сообщение об ошибке в stderr.

В 3-м и 4-м вызовах программа Python дублирует файловый дескриптор 1 как файловый дескриптор 2, достигая желаемого эффекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top