如何在Python中将exec-ed进程的stderr重定向到stdout?

3 投票
1 回答
1551 浏览
提问于 2025-04-15 19:34

在一个bash脚本中,我可以这样写:

exec 2>&1
exec someprog

这样,someprog的错误输出就会被重定向到标准输出。

有没有办法用python的os.exec*函数做类似的事情呢?

这个不需要跨平台,只要在Linux上能工作就行。

1 个回答

5

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 命令并没有把信息写到标准输出(stdout),而是把错误信息写到了标准错误(stderr)中。

在第三次和第四次执行中,Python 程序将文件描述符1(标准输出)复制为文件描述符2(标准错误),这样就达到了我们想要的效果。

撰写回答