2016-11-21 228 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