给定简单的脚本:
#!/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”?
最佳答案
感谢 Daniel Voina 找到了解决方案。
问题是由于 fcron 的语言环境:它将默认语言环境替换为 POSIX,因此 Python 无法将 unicode 写入 stdout/stderr。 This thread描述了此问题的解决方案:只需在 fcrontab -e
顶部添加行 LC_ALL=en_US.UTF-8
(或其他区域设置),现在脚本执行时无需I/O 错误。
fcrontab -l
示例:
LC_ALL=en_US.UTF-8
LC_TIME=ru_RU.UTF-8
0 0 * * * /full/path/to/script.py
关于python - 为什么Python3解释器仅在通过fcron执行时才会引发UnicodeEncodeError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39524764/