python3:在没有外部设置 PYTHONIOENCODING 的情况下为 stdout/stderr 强制使用 utf-8?

python3: Forcing utf-8 for stdout/stderr without externally setting PYTHONIOENCODING?

我正在使用 python3,我希望我的程序将 utf-8 用于 stdoutstderr,而无需设置 PYTHONIOENCODING python 程序外的 utf-8 环境变量。

换句话说,我希望选择强制 utf-8 输出包含在 python 程序本身中,无论 PYTHONIOENCODING 的设置是什么或没有设置在调用者的环境中指定。

到目前为止,我想出的唯一 python3 特定方法是按如下方式启动程序:

#!/usr/bin/python3.6                                                                                                            

import os
import sys
if os.environ.get('PYTHONIOENCODING', '').lower() != 'utf-8':
    os.environ['PYTHONIOENCODING'] = 'utf-8'
    sys.exit(os.execl(
        sys.executable, 
        os.path.basename(sys.executable), 
        *sys.argv
    ))

# Remainder of my program ...

理想情况下,我想在不必重新执行 python3 解释器的情况下实现它,但我担心我可能运气不好。

有什么建议吗?非常感谢。

附录:

根据下面答案中的评论,我尝试了以下方法,但它没有打印任何内容...

#!/usr/bin/python3.6
open(sys.stdout.buffer.fileno(), 'w', encoding='utf8')
open(sys.stderr.buffer.fileno(), 'w', encoding='utf8')
print('Seems to be working')
sys.exit(0)

我也试过 utf-8(带连字符),它也没有打印任何东西。

有人建议

sys.stdout = codecs.getwriter("UTF-8")(sys.stdout)

其他人说这可能会破坏一些库。

现在我更好地理解了 lenz 的建议,并且找到了答案:

#!/usr/bin/python3.6
import os
import sys
sys.stdout = os.fdopen(sys.stdout.buffer.fileno(), 'w', encoding='utf8')
sys.stderr = os.fdopen(sys.stderr.buffer.fileno(), 'w', encoding='utf8')

自 Python 3.7 起,TextIOWrapper 为您提供 reconfigure 方法:

sys.stdin.reconfigure(encoding="utf-8")
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")