2016-09-16 31 views
1

給出的簡單腳本:爲什麼Python3解釋器僅在通過fcron執行時才引發UnicodeEncodeError?

#!/usr/bin/env python3 

b = 'строка'.encode() 
print(b.decode('utf-8')) 

如果我直接作爲python3 script.py/full/path/to/script.py或間接地運行它通過的crontab(例如0 0 * * * /full/path/to/script.py),然後它的正常執行(沒有錯誤)。但是,當它通過fcrontab執行鍼對同一$ USER(用同樣的工作0 0 * * * /full/path/to/script.py)那麼Python 3.5.2引發異常:

Traceback (most recent call last): 
    File "/full/path/to/script.py", line 4, in <module> 
    print(b.decode('utf-8')) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) 

豈是可能的嗎?爲什麼Python嘗試將字節解碼爲'ascii'而不是'utf-8'?

+1

看到這裏https://wiki.python.org/moin/PrintFails –

+0

哦,它是真正的問題與設定給fcron因爲現場的只有'print'功能(在我的情況fcron有locales'POSIX'而不是* .UTF-8)...謝謝! – kupgov

回答

1

感謝Daniel Voina解決方案被發現。

問題是因爲fcron的locale環境:它用POSIX替換默認語言環境,所以Python無法將unicode寫入stdout/stderr。 This thread描述了這個問題的解決方案:只需要在fcrontab -e的頂部添加LC_ALL=en_US.UTF-8(或其他區域設置)行,並且現在腳本在沒有I/O錯誤的情況下執行。

fcrontab -l例子:

LC_ALL=en_US.UTF-8 
LC_TIME=ru_RU.UTF-8 
0 0 * * * /full/path/to/script.py 
相關問題