从crontab运行python脚本时的编码问题

时间:2016-11-21 10:36:10

标签: python-2.7 encoding cron

我正在将我的python脚本从一个服务器迁移到一个新的docker容器。但我面临一个奇怪的编码问题,我尝试了几个没有成功的解决方案。

如果我直接从终端运行脚本(手动),则会成功执行。但是,如果我通过crontab运行,我会收到以下错误:

  

UnicodeEncodeError:' ascii'编解码器不能编码字符

我创建了一个小脚本来检查编码:

import sys
print sys.stdout.encoding

如果我手动运行,我会收到以下回复:

  

UTF-8

然后,我在cron中添加了这个脚本并将输出定向到一个文件:

 * * * * *   /tmp/p.py > /tmp/p.log

它保存了一个空的p.log ...所以我认为python没有从crontab获取编码。

我在调用命令之前看到了几个在crontab中添加编码变量的建议,但它对我没用。 例如:

* * * * *  PYTHONIOENCODING=UTF-8 /tmp/p.py > /tmp/p.log

* * * * *  LANG=UTF-8 /tmp/p.py > /tmp/p.log

另外,我试图将这些变量添加到我的crontab文件的头部。根本没有成功。

我正在使用安装了少量语言环境的Ubuntu:

    locale -a 
    C 
    C.UTF-8 
    en_US.utf8 
    POSIX

这是我的语言环境(在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=

我运行了几个python脚本,所以编辑它们并不是一个好主意(同样,正如我所说,它在cron外部调用时运行完美)。

1 个答案:

答案 0 :(得分:3)

实际上这是crontab的一个问题,它在编辑文件时没有自动重新加载。

为了强制重装,我做了:

crontab /etc/crontab

service cron restart

现在crontab正确加载了环境变量。在crontab文件的标题中有以下变量:

SHELL=/bin/bash

TERM=xterm
PYTHONIOENCODING=UTF-8
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8