Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python3解释器只有在';是通过fcron执行的吗?_Python_Python 3.x_Utf 8_Io_Cron - Fatal编程技术网

为什么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
功能确实存在问题。。。非常感谢。