我正在將我的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外部調用時它運行完美)。