2013-10-26 12 views
7

Ben python3 ebay sdk taşıyorum ve aşağıdaki konuya tökezledim.Pycurl ve io.StringIO - pycurl.error: (23, 'Yazılı yazı gövdesi)

Bazı HTTP istekleri göndermek için pycurl kullanıyorum. İşte Ben yapılandırmak nasıl:

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) 

ben self._curl.perform() aşağıdaki hatayı alıyorum aradığında: Ben bu bir sorun olduğu anlamına gelir Bildiğim kadarıyla

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

Yazma işleviyle, ama tam olarak ne olduğunu anlayamıyorum. StringIO modülünden io'ya geçişle ilgili olabilir, ancak emin değilim.

UPD: aşağıdaki denedim:

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) 

ve çalışıyor. Lambdas ile aynı hile yapmaya çalıştım (bu garip fonksiyonu tanımlamak yerine, ama işe yaramadı.)

cevap

13

Sorun şu ki, Pycurl artık StringIO ile istediğiniz gibi çalışmaktadır. . io.BytesIO yerine ardından bilgi tampon yazılır ve bir dize içine deşifre alabilirsiniz

yerine StringIO ait pycurl ile BytesIO kullanma:.

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

Kod çözme bayt bilgi:

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

İstediğiniz herhangi bir kod çözme kodunu kullanabilirsiniz, ancak bu, ayrıştırabileceğiniz bir dize nesnesi vermelidir.

Umut bu Python 3. kullanarak insanlara yardım

+0

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