2011-09-12 10 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 내가이 문제를 해결하는 방법, 계란 파일 내부에 ? 이 버그는 tweepy의 버그입니까?

이 기능은 파일 (이미지)을 읽고 POST (HTTP)를 통해 트위터 API에 보냅니다.

로드 된 이미지를 조작하려고 할 때 오류가 발생합니다.

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

자세한 내용을 확인하십시오. update_profile_background_image() 호출은 어떻게 생겼습니까? 오류가있을 수 있습니다. 아직 알 수 없습니다. – naeg

+0

일반 링크 : http://docs.python.org/howto/unicode.html – Carpetsmoker

답변

4

내 생각은 filename는 유니 코드 문자열이라는 것이다 : 내 모든 평

는 UTF-8을 사용하도록 구성 할 수 있습니다. 불행히도 Tweepy는 유니 코드 파일 이름을 지원하지 않습니다. 이거 버그 야? 틀림없이.

문제는 대신 바이트 문자열로 아래로 인코딩, 그대로 유니 코드 문자열을 사용하여 HTTP POST 데이터를 만들려고 할 것입니다 : 이것은 body 목록에서 하나의 문자열 유니 코드 문자열을 만드는

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

, 시퀀스의 한 문자열이 유니 코드 문자열이고 join() 인 경우 그 결과는 유니 코드가됩니다. 그러나 HTTP POST 본문은 바이너리 gunk가로드 된 바이트 문자열이므로 ASCII 호환이 아니므로 암시 적으로 유니 코드로 변환하려고 시도하지 않습니다.

(위의 코드 에서처럼 Content-Disposition에 주어진 파일 이름에는 완전한 경로가 포함되어서는 안됩니다.) 위의 줄에과 같은 것이 좋습니다. 그래도 트위터가 파일 이름이 무엇인지 신경 쓰지는 않아 ...)

관련 문제