UnicodeDecodeError при импорте (tweepy) - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь использовать функцию "update_profile_background_image" в 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)

Проблема в том, что эта библиотека находится внутри файла яйца, как мне решить эту проблему?Это ошибка на tweepy?

Функция состоит в том, чтобы прочитать файл (изображение) и отправить через POST (http) в твиттер API.

Ошибка возникает в точке, где я пытаюсьманипулировать загруженным изображением.

Все мои .py настроены на использование utf-8:

# -- coding: utf-8 --

1 Ответ

4 голосов
/ 13 сентября 2011

Я предполагаю, что filename является строкой Юникода.К сожалению, Tweepy не поддерживает имена файлов Unicode.Это ошибка?Возможно.

Проблема в том, что он пытается создать данные HTTP POST, используя дословную строку Unicode, вместо того, чтобы кодировать их до байтовой строки:

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

Это делает одну строку вbody перечисляет строку Unicode, и когда одна строка в последовательности является строкой Unicode, и вы пытаетесь join() их, в результате получается Unicode.Однако тело HTTP POST представляет собой байтовую строку с загрузкой двоичного ганка, поэтому оно не является ASCII-совместимым и поэтому делает попытку неявно принудительно привести его к Unicode.

(В любом случае имя файлав Content-Disposition определенно не должен содержать полный путь, как в приведенном выше коде. Я бы предложил что-то вроде filename= os.path.basename(filename).encode('us-ascii', 'ignore') в строке перед вышеупомянутым в качестве первого быстрого исправления. Я не уверен, что Twitter даже заботится о том, чтоимя файла, хотя ...)

...