我正在使用python3
,并且我希望我的程序将utf-8
用于stdout
和stderr
,而不必设置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
(带连字符),它也不打印任何内容。
答案 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")