UnicodeEncodeError only when running as a cron job
我的程序在命令行中工作正常,但是当我以cron作业的形式运行它时,它会因错误而崩溃:
1 2
| UnicodeEncodeError: 'ascii' codec can't encode character
u'\xa7' in position 13: ordinal not in range(128) |
它在声明上崩溃了
为什么只有当应用程序作为cron作业运行时才会发生这种情况?怎么能解决这个问题?
我试过(没有帮助):
Python是2.7
- 请参阅stackoverflow.com/questions/492483/…
- 我认为这是相同的问题;当stdout是终端时,python 2使用unicode,而不是管道时(就像cron作业中那样)。
不,你可以简单一点。在执行这个脚本之前,只需定义pythoniencoding。这样地:
1 2 3 4 5
| PATH=<your path>
MAILTO=someone@somewhere
PYTHONIOENCODING=utf8
* * * * * /run/your/script |
- 事实上,这是正确的答案。酷!:)
- 如果我能,我会给你+2。这狗屎把我的头弄乱了!
- 他说的…我来了,两年后,这让许多键盘免于被砸烂。
- 这应该是公认的答案。@xralf你能更新一下吗?
- 天哪,非常感谢!我好几个小时都在发疯,想弄清楚到底是怎么回事。
- 别忘了"导出pythonioencoding"
- @蒂埃里,那是克朗塔布,不是巴什脚本。
旁白:这是一个常见的问题;因此,这可能是一个重复的问题。
2.7上的默认编码是ascii。您需要为程序的输出提供编码。要使用的通用编码是"utf8"。
所以你应该这样做:
1
| print title.encode('utf8') |
以下是检查默认编码的一种方法:
1 2 3 4
| import sys
sys.getdefaultencoding()
# -> 'ascii' |
- 谢谢你的回答,但为什么这不工作,只有当应用程序运行为cron作业?
- …根据提供的信息很难说出来。您可能正在传递一个不同的输入。它是否有效不是问题。作为一个负责任的程序员,您应该关心使用非ASCII字符的代码。
- 实际上,字符串是从sqlite数据库中获取的。它是文本类型,编码为utf-8 sqlite.org/datatype3.html。当它通过"%s%s"%(s1,s2)与另一个字符串组合时,python可能更改了它。
- 好的,当你从数据库中得到它时,把它解码成Unicode码;例如,'mystring'.decode('utf8')。然后按照上面提到的输出进行编码。而且,是的,当组合字符串时,python 2.7会自动转换为unicode。所以在这种情况下你不需要解码,但是如果你这样做的话会更清楚。
- @伯尼:它使用ascii编解码器进行自动转换。它不仅仅是更清晰的解码,它真的是唯一理智的方法来避免错误。
- @戴尼思:同意。谢谢你的评论。
- @xralf:cron作业与之不同,可能是因为它以不同的用户或非交互shell运行,其中LANG变量未设置。检查os.environ.get('LANG')的值和sys.stdout.encoding的值。
- >>> import os, sys >>> os.environ.get("LANG") 'en_US.UTF-8' >>> sys.stdout.encoding 'UTF-8'