Я выяснил свою проблему. Кажется, в urllib2.Request
/ urllib2.urlopen()
(по крайней мере, в Python 2.7)
есть неясное поведение
Конструктор urllib2.Request(url, data, headers)
, похоже, ожидает того же типа строки в своих URL-адресах и параметрах данных.
Я давал параметру данных необработанные данные из файла read()
вызова (который в Python 2.7 возвращает его в виде «простой» строки), но мой URL был случайно Unicode, потому что я конкатенировал часть URL из результата другой функции, которая возвратила строки Unicode.
Вместо того, чтобы пытаться «вывести» url
из Unicode -> простых строк, он попытался «выкинуть» параметр data
в Unicode, и это дало мне ошибку кодека. (как ни странно, это происходит при вызове функции urllib2.urlopen()
, а не в конструкторе urllib2.Request
)
Когда я изменил свой вызов функции на
# headers contains `{'Content-Type': 'application/octet-stream'}`
r = urllib2.Request(url.encode('utf-8'), data, headers)
все работало нормально.