为什么Python3解释器只有在';是通过fcron执行的吗?
考虑到简单的脚本:为什么Python3解释器只有在';是通过fcron执行的吗?,python,python-3.x,utf-8,io,cron,Python,Python 3.x,Utf 8,Io,Cron,考虑到简单的脚本: #!/usr/bin/env python3 b = 'строка'.encode() print(b.decode('utf-8')) 如果我直接以python3script.py或/full/path/to/script.py或通过crontab间接运行它(例如0***/full/path/to/script.py),那么它会正常执行(没有错误)。但是当它通过fcrontab为同一个$USER(使用相同的作业0***/full/path/to/script.py)执
#!/usr/bin/env python3
b = 'строка'.encode()
print(b.decode('utf-8'))
如果我直接以python3script.py
或/full/path/to/script.py
或通过crontab间接运行它(例如0***/full/path/to/script.py
),那么它会正常执行(没有错误)。但是当它通过fcrontab为同一个$USER(使用相同的作业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)
回溯(最近一次呼叫最后一次):
文件“/full/path/to/script.py”,第4行,在
打印(b.解码('utf-8'))
UnicodeEncodeError:“ascii”编解码器无法对位置0-2中的字符进行编码:序号不在范围内(128)
怎么可能呢?为什么Python尝试将字节解码为“ascii”而不是“utf-8” 多亏了Daniel Voina,才找到了解决方案 问题是因为fcron的locale环境:它用POSIX替换默认的locale,因此Python无法将unicode写入stdout/stderr。描述此问题的解决方案:只需在
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
请看这里哦,由于为fcron设置的区域设置(在我的例子中,fcron的区域设置为“POSIX”而不是*.UTF-8),因此仅使用
print
功能确实存在问题。。。非常感谢。