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

时间:2019-04-18 02:38:21

标签: python-3.x encoding utf-8 exec

我正在使用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(带连字符),它也不打印任何内容。

3 个答案:

答案 0 :(得分:1)

有人建议

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

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

答案 1 :(得分:0)

现在我更好地了解了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')

答案 2 :(得分:0)

从Python 3.7开始,TextIOWrapper为您提供了reconfigure方法:

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