2012-08-07 30 views
1

許多人希望能夠聯繫起來,這種編碼問題正在驅動我精神。我真的很感激這件事!在CRON作業中運行Python腳本編碼時遇到的問題

最終目標是能夠從終端和cron以及從cron與> stdout.txt運行相同的script.py。不用說,我遇到了嚴重的編碼問題。

我script.py運行從終端從而精細:python script.py
它引發錯誤,但是,來自終端從而運行時:python script.py > stdout.txt
它將引發時在cron運行相同的錯誤,無論哪種方式。

我有一個python腳本,以root身份輸入crontab -e

這是我script.py標題:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

這是我的cron項:

* * * * * python /home/ubuntu/parrot/script.py > /home/ubuntu/parrot/stdout.txt 

這是我stdout.txt(相關部分):

Unexpected error! (<type 'exceptions.UnicodeDecodeError'>, UnicodeDecodeError('ascii', 'blabla some weird text n\xc3\xa5r end', 54, 55, 'ordinal not in range(128)')) 

這是我從終端(相關部分)的env:

LANG=en_US.UTF-8 

這是從cron我ENV(相關部分):

LANG=en_US.UTF-8 

這是script.py(第一)行引發錯誤:

print 'Posting @%s: %s' % (statusObj.user.screen_name.encode('ascii', 'replace'), statusObj.text.encode('utf-8', 'replace')) 

編輯: sys.getdefaultencoding()返回ascii

任何幫助,非常感謝!

+0

是什麼'sys.getdefaultencoding()'返回? – 2012-08-07 00:34:12

+0

它返回ascii – knutole 2012-08-07 00:37:40

+1

爲什麼我有一種不好的感覺?.. – knutole 2012-08-07 00:49:32

回答

1

如果您可以控制statusObj您應該檢查相關的代碼,將數據解析到對象中,並嘗試儘可能獲得輸入爲clean

在嘗試對其進行編碼之前,您想確保將您的字符串解碼爲unicode。

如果沒有,你可以嘗試:

# try to get the string into unicode 
screen_name = unicode(statusObj.user.screen_name) 
post = unicode(statusObj.text) # probably an error here? 
output_str = u"Posting @{name}: {post}".format(name=screen_name, post=post) 
print output_str.encode("utf8", "replace") # encode the unicode string on 
+0

但我的代碼已經從CLI工作。所以它必須與cron的編碼環境有關?我會嘗試壽。謝謝! – knutole 2012-08-07 01:14:28

+0

我剛剛將sys.stdout = codecs.getwriter('utf8')(sys.stdout) 添加到頂部並完全刪除.encode'。問題解決了!非常感謝! =) – knutole 2012-08-07 04:37:20