为什么Python3解释器只有在通过fcron执行时才会引发UnicodeEncodeError?

时间:2016-09-16 06:09:40

标签: python python-3.x utf-8 io cron

给出简单的脚本:

#!/usr/bin/env python3

b = 'строка'.encode()
print(b.decode('utf-8'))

如果我直接以python3 script.py/full/path/to/script.py或通过crontab(例如0 0 * * * /full/path/to/script.py)间接运行,那么它会正常执行(没有错误)。但是当它通过 fcrontab 执行相同的$ USER(具有相同的作业0 0 * * * /full/path/to/script.py)时,Python 3.5.2会引发异常:

Traceback (most recent call last):
  File "/full/path/to/script.py", line 4, in <module>
    print(b.decode('utf-8')) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

怎么可能?为什么Python尝试将字节解码为'ascii'而不是'utf-8'?

1 个答案:

答案 0 :(得分:2)

感谢Daniel Voina找到解决方案。

问题在于fcron的语言环境:它用POSIX替换默认语言环境,因此Python无法将unicode写入stdout / stderr。This thread描述了解决此问题的方法:它只需要添加行LC_ALL=en_US.UTF-8顶部的fcrontab -e(或其他语言环境设置),现在脚本在没有I / O错误的情况下执行。

fcrontab -l的示例:

LC_ALL=en_US.UTF-8
LC_TIME=ru_RU.UTF-8
0 0 * * * /full/path/to/script.py