发布照片时出现TypeError:'unicode'没有缓冲区接口

0 投票
1 回答
833 浏览
提问于 2025-04-20 12:20

我正在尝试使用 tumblpy 这个包来排队上传一张照片。最近我把我的Python环境从Canopy(在Windows上,版本是2.7.6,记得没错的话)换成了Anaconda(使用的是Python 2.7.7),而这个错误之前从来没有出现过。

当我运行这个代码时:

import tumblpy
t = tumblpy.Tumblpy(hidden_key1, hidden_key2, hidden_key3, hidden_key4)
photo = open('C:/Users/David/Documents/Images_API/med_aerotransport.jpg', 'rb')
photo

输出结果是:

<open file 'C:/Users/David/Documents/Images_API/med_aerotransport.jpg', mode 'rb' at 0x0000000006161270>

现在当我尝试上传这张照片时:

response = t.post('post',
                  blog_url='http://postersvintage.tumblr.com/', 
                  params={'type':'photo',
                          'state':'queue',
                          'caption': 'Vintage Med Aerotransport poster',
                          'tags':'vintage, poster',
                          'data': photo})

这里是整个错误信息,最后显示 TypeError: 'unicode' does not have the buffer interface

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-c560435c7a77> in <module>()
      5                           'caption': 'Vintage Med Aerotransport poster',
      6                           'tags':'vintage, poster',
----> 7                           'data': photo})

C:\Users\David\Anaconda\lib\site-packages\python_tumblpy-1.0.2-py2.7.egg\tumblpy\api.pyc in post(self, endpoint, blog_url, extra_endpoints, params)
    170     def post(self, endpoint, blog_url=None, extra_endpoints=None, params=None):
    171         return self.request(endpoint, method='POST', blog_url=blog_url,
--> 172                             extra_endpoints=extra_endpoints, params=params)
    173 
    174     def get_avatar_url(self, blog_url, size=64):

C:\Users\David\Anaconda\lib\site-packages\python_tumblpy-1.0.2-py2.7.egg\tumblpy\api.pyc in request(self, endpoint, method, blog_url, extra_endpoints, params)
    124                 if files:
    125                     kwargs['params'] = params
--> 126                 response = func(url, **kwargs)
    127         except requests.exceptions.RequestException:
    128             raise TumblpyError('An unknown error occurred.')

C:\Users\David\Anaconda\lib\site-packages\requests-1.2.2-py2.7.egg\requests\sessions.pyc in post(self, url, data, **kwargs)
    375         """
    376 
--> 377         return self.request('POST', url, data=data, **kwargs)
    378 
    379     def put(self, url, data=None, **kwargs):

C:\Users\David\Anaconda\lib\site-packages\requests-1.2.2-py2.7.egg\requests\sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert)
    322 
    323         # Prepare the Request.
--> 324         prep = req.prepare()
    325 
    326         # Send the request.

C:\Users\David\Anaconda\lib\site-packages\requests-1.2.2-py2.7.egg\requests\models.pyc in prepare(self)
    223         p.prepare_headers(self.headers)
    224         p.prepare_cookies(self.cookies)
--> 225         p.prepare_body(self.data, self.files)
    226         p.prepare_auth(self.auth, self.url)
    227         # Note that prepare_auth must be last to enable authentication schemes

C:\Users\David\Anaconda\lib\site-packages\requests-1.2.2-py2.7.egg\requests\models.pyc in prepare_body(self, data, files)
    383             # Multi-part file uploads.
    384             if files:
--> 385                 (body, content_type) = self._encode_files(files, data)
    386             else:
    387                 if data:

C:\Users\David\Anaconda\lib\site-packages\requests-1.2.2-py2.7.egg\requests\models.pyc in _encode_files(files, data)
    131             new_fields.append((k, new_v))
    132 
--> 133         body, content_type = encode_multipart_formdata(new_fields)
    134 
    135         return body, content_type

C:\Users\David\Anaconda\lib\site-packages\requests-1.2.2-py2.7.egg\requests\packages\urllib3\filepost.pyc in encode_multipart_formdata(fields, boundary)
     75                                'filename="%s"\r\n' % (fieldname, filename))
     76             body.write(b('Content-Type: %s\r\n\r\n' %
---> 77                        (content_type,)))
     78         else:
     79             data = value

TypeError: 'unicode' does not have the buffer interface

1 个回答

1

这个问题通过更新 requests 库解决了,正如Martijn Pieters所建议的那样。

撰写回答