Tho*_*mas 2 cron encoding python-2.7
我正在将我的 python 脚本从一台服务器迁移到一个新的 docker 容器。但是我在编码方面遇到了一个奇怪的问题,我尝试了几种解决方案但没有成功。
如果我直接从终端(手动)运行脚本,它会成功执行。但是如果我通过 crontab 运行,我会收到以下错误:
UnicodeEncodeError: 'ascii' 编解码器无法编码字符
我创建了一个小脚本来检查编码:
import sys
print sys.stdout.encoding
Run Code Online (Sandbox Code Playgroud)
如果我手动运行,我会得到以下响应:
UTF-8
然后,我在 cron 中添加了这个脚本并将输出定向到一个文件:
* * * * * /tmp/p.py > /tmp/p.log
Run Code Online (Sandbox Code Playgroud)
它保存了一个空的 p.log ......所以我认为 python 没有从 crontab 获取编码。
我看到一些建议在调用命令之前在 crontab 中添加编码变量,但它对我不起作用。举个例子:
* * * * * PYTHONIOENCODING=UTF-8 /tmp/p.py > /tmp/p.log
Run Code Online (Sandbox Code Playgroud)
或者
* * * * * LANG=UTF-8 /tmp/p.py > /tmp/p.log
Run Code Online (Sandbox Code Playgroud)
另外,我试图在我的 crontab 文件的头部添加这个变量。根本没有成功。
我正在使用安装了几个语言环境的 Ubuntu:
locale -a
C
C.UTF-8
en_US.utf8
POSIX
Run Code Online (Sandbox Code Playgroud)
这是我的语言环境(在 cron 之外):
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)
我有几个 python 脚本正在运行,所以编辑它们不是一个好主意(而且,正如我所说,它在外部 cron 调用时运行良好)。
实际上这是 crontab 的一些问题,它在编辑文件时没有自动重新加载。
为了强制重新加载,我做了:
crontab /etc/crontab
Run Code Online (Sandbox Code Playgroud)
和
service cron restart
Run Code Online (Sandbox Code Playgroud)
现在 crontab 正在正确加载环境变量。在 crontab 文件的标题中有以下变量:
SHELL=/bin/bash
TERM=xterm
PYTHONIOENCODING=UTF-8
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |