将 stderr 从 python 的 exec-ed 进程重定向到 stdout?

its*_*dok 3 python linux redirect file-descriptor

在 bash 脚本中,我可以编写:

exec 2>&1
exec someprog
Run Code Online (Sandbox Code Playgroud)

并且 stderr 输出someprog将被重定向到 stdout。

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

这不必是可移植的,只需在 Linux 上工作即可。

Ign*_*ams 5

os.dup2(1, 2)

启发性的例子

让我们/bin/ls用一个虚假的参数来执行,以便它向 stderr 抱怨。

$ python -c "import os; os.execl('/bin/ls', '', 'ffweew')" 1>/dev/null
:ffweew: 没有这样的文件或目录
$ 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: 没有这样的文件或目录
$

前两次调用证明ls不会写入 stdout,而是将错误消息写入 stderr。

在第3次和第4次调用中,Python程序将文件描述符1复制为文件描述符2,达到了预期的效果。