2013-10-26 13 views
7

Ich portiere ebay sdk zu python3 und ich bin auf das folgende Problem gestoßen.Pycurl und io.StringIO - pycurl.error: (23, 'Fehler beim Schreiben von Körper)

Ich verwende pycurl, um einige HTTP-Anfragen zu senden. Hier ist, wie ich es konfigurieren:

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) 

Wenn ich rufe self._curl.perform() bekomme ich folgende Fehlermeldung:

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

Soweit ich weiß, dass dies bedeutet, dass es ein Problem ist mit der Schreibfunktion, aber ich kann nicht herausfinden, was es genau ist. Könnte mit der Migration vom StringIO-Modul zu io zusammenhängen, bin mir aber nicht sicher.

UPD: Ich habe versucht, die folgenden:

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) 

und es funktioniert. Ich habe versucht, den gleichen Trick mit Lambdas zu tun (anstatt diese peinliche Funktion zu definieren, aber es hat nicht funktioniert.

Antwort

13

Ich glaube, das Problem ist, dass Pycurl nicht mehr mit StringIO wie gewünscht funktioniert. Eine Lösung ist zu verwenden . io.BytesIO stattdessen Sie können dann Informationen in den Puffer geschrieben werden und es in einen String dekodieren

mit BytesIO mit pycurl statt StringIO.

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

Decodierung Byte Informationen aus dem BytesIO Objekt:

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

Sie können jede Art von Decodierung verwenden, die Sie möchten, aber dies sollte Ihnen ein String-Objekt geben, das Sie analysieren können.

hoffe, das hilft Menschen mit Python 3.

+0

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

Verwandte Themen