我不应该用这个开始所有我的python程序吗?做这样的执行官时有什么特别的遗失吗?
#!/usr/bin/python
import os, sys
if sys.stdout.encoding == None:
os.putenv("PYTHONIOENCODING",'UTF-8')
os.execv(sys.executable,['python']+sys.argv)
print sys.stdout.encoding
有60 questions about PYTHONIOENCODING所以我想这是一个常见问题,但如果您不知道,这样做是因为当sys.stdout.encoding == None
时您只能打印ascii字符,例如print "åäö"
会抛出异常..
编辑当stdout是管道时,这种情况发生在我身上; python encoding.py|cat
会将编码设置为无
另一个解决方案是更改codec of stdout sys.stdout = codecs.getwriter('utf8')(sys.stdout)
,我猜这是正确的答案,请回答对该问题的评论。
答案 0 :(得分:8)
是的,有充分的理由不启动所有类似的Python程序。
首先:
如果Python不知道stdout支持的编码,则 sys.stdout.encoding
为None。在大多数情况下,这是因为它根本不支持任何编码。在你的情况下,这是因为stdout是一个文件,而不是终端。但它可以设置为None,因为Python也无法检测到终端的编码。
其次:设置环境变量,然后再次使用smae命令启动新进程。那太难看了。
所以,除非你打算成为唯一一个使用你的程序的人,否则你不应该那样开始。但如果你做计划成为唯一使用你的程序的人,那就继续吧。
更深入的解释
Python 2下更好的通用解决方案是将stdout视为它是什么:一个8位接口。这意味着你打印到stdout的任何东西应该是8位。当您尝试打印Unicode数据时会出现错误,因为打印将尝试将Unicode数据编码为stdout的编码,如果它为None,则它将采用ASCII,并且失败,除非您设置了PYTHONIOENCODING。
但是通过打印编码数据,您没有这个问题。即使输出管道输出,以下工作也很完美:
print u'ÅÄÖ'.encode('UTF8')
(但是,这将失败在Python 3下,因为在Python 3下,stdout不再是8位IO,你应该给它Unicode数据,它将自行编码。如果你给它二进制数据,它将打印表示。因此,在Python 3中,你首先没有这个问题。)