2013-10-26 14 views
7

Tôi đang chuyển ebay sdk sang python3 và tôi đã tình cờ gặp vấn đề sau.Pycurl và io.StringIO - pycurl.error: (23, 'Không thể viết nội dung)

Tôi đang sử dụng pycurl để gửi một số yêu cầu HTTP. Dưới đây là cách tôi cấu hình nó:

self._curl = pycurl.Curl() 
    self._curl.setopt(pycurl.FOLLOWLOCATION, 1) 
    self._curl.setopt(pycurl.URL, str(request_url)) 
    self._curl.setopt(pycurl.SSL_VERIFYPEER, 0) 

    self._response_header = io.StringIO() 
    self._response_body = io.StringIO() 

    self._curl.setopt(pycurl.CONNECTTIMEOUT, self.timeout) 
    self._curl.setopt(pycurl.TIMEOUT, self.timeout) 

    self._curl.setopt(pycurl.HEADERFUNCTION, self._response_header.write) 
    self._curl.setopt(pycurl.WRITEFUNCTION, self._response_body.write) 

Khi tôi gọi self._curl.perform() tôi nhận được lỗi sau:

pycurl.error: (23, 'Failed writing body (1457 != 1460)') 

Theo như tôi biết điều này có nghĩa là có một vấn đề với chức năng viết, nhưng tôi không thể hiểu chính xác nó là gì. Có thể liên quan đến việc di chuyển từ mô-đun StringIO sang io, nhưng tôi không chắc chắn.

UPD: Tôi đã thử những điều sau đây:

def body(buf): 
     self._response_body.write(buf) 

    def header(buf): 
     self._response_header.write(buf) 

    self._curl.setopt(pycurl.HEADERFUNCTION, header) 
    self._curl.setopt(pycurl.WRITEFUNCTION, body) 

và nó hoạt động. Tôi đã cố gắng làm điều tương tự với lambdas (thay vì xác định hàm khó xử đó, nhưng nó không hoạt động.

Trả lời

13

Tôi tin rằng vấn đề là pycurl không còn hoạt động với StringIO như mong muốn nữa. . io.BytesIO thay vì Bạn có thể sau đó được thông tin ghi vào bộ đệm và giải mã nó thành một chuỗi

Sử dụng BytesIO với pycurl thay vì StringIO:.

e = io.BytesIO() 
c.setopt(pycurl.WRITEFUNCTION, e.write) 

giải mã byte thông tin từ đối tượng BytesIO:

htmlString = e.getvalue().decode('UTF-8') 

Bạn có thể sử dụng bất kỳ loại giải mã nào bạn muốn, nhưng điều này sẽ cung cấp cho bạn một đối tượng chuỗi bạn có thể phân tích cú pháp.

Hy vọng điều này sẽ giúp mọi người sử dụng Python 3.

+0

http://pycurl.sourceforge.net/doc/unicode.html#writing-to-stringio-bytesio –

Các vấn đề liên quan