给出简单的脚本:
#!/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'?
答案 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