2016-11-21 59 views
0

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

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

UnicodeEncodeError: 'ascii' codec can't encode character

我创建了一个小的脚本只是为了检查编码:

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

其实这是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