2011-09-12 60 views
1

我試着去使用tweepy功能「update_profile_background_image」,並得到錯誤:的UnicodeDecodeError進口(tweepy)

Traceback (most recent call last): 
    File "XXX.py", line 1401, in <module> 
    psn_card.gen_twitter_bg(user_db) 
    File "XXX.py", line 972, in gen_twitter_bg 
    auth_api.update_profile_background_image(file) 
    File "build/bdist.linux-x86_64/egg/tweepy/api.py", line 346, in update_profile_background_image 
    headers, post_data = API._pack_image(filename, 800) 
    File "build/bdist.linux-x86_64/egg/tweepy/api.py", line 729, in _pack_image 
    body = '\r\n'.join(body) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 0: ordinal not in range(128) 

的問題是:這個LIB是一個egg文件裏面,我該如何解決這個問題? 這是tweepy上的錯誤嗎?

該功能是讀取文件(圖片)並通過POST(http)發送到twitter api。

錯誤發生在我嘗試操作加載圖像的地方。

我所有的.py都配置爲使用UTF-8:

# -- coding: utf-8 -- 
+1

請更多信息。你對update_profile_background_image()的調用是什麼樣的?錯誤可能在那裏,我們還不能確定。 – naeg

+0

可能有用的常用鏈接:http://docs.python.org/howto/unicode.html – Carpetsmoker

回答

4

我的猜測是filename是Unicode字符串。不幸的是,Tweepy不支持Unicode文件名。這是一個錯誤?可以說。

的問題是它會嘗試的,而不是編碼它歸結爲一個字節的字符串創建使用Unicode字符串逐字的HTTP POST數據:

body.append('Content-Disposition: form-data; name="image"; filename="%s"' % filename) 

這使得在body列表中的一個串一個Unicode字符串,並且當序列中的一個字符串是一個Unicode字符串,並且您嘗試使用它們時,結果最終會變爲Unicode。然而,HTTP POST正文是一個二進制gunk載入的字節字符串,因此它不是ASCII兼容的,因此會使其嘗試隱式地將其強制轉換爲Unicode失敗。

(在任何情況下,在Content-Disposition給出的文件名絕對不應該包含一個完整路徑,如上面的代碼一樣。我建議上述前行類似filename= os.path.basename(filename).encode('us-ascii', 'ignore')作爲第一個一蹴而就的事情。我不確定Twitter甚至在意文件名是什麼,儘管...)