2013-10-26 4 views
7

저는 ebay sdk를 python3으로 이식하고 있는데 다음 문제를 발견했습니다.Pycurl 및 io.StringIO - pycurl.error : (23, '본문 작성 실패)

일부 HTTP 요청을 보내려면 pycurl을 사용하고 있습니다. 여기 내가 그것을 구성하는 방법입니다 :

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) 

나는 self._curl.perform() 나는 다음과 같은 오류 얻을 호출 할 때 :이 문제가 있음을 의미 알고 지금까지

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

을 쓰기 기능과 함께,하지만 정확히 무엇인지 알아낼 수 없습니다. StringIO 모듈에서 io 로의 마이그레이션과 관련이있을 수 있지만 확실하지 않습니다.

UPD : 나는 다음 시도했다 :

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) 

을하고 그것을 작동합니다. 난 그 멍청한 기능을 정의하는 대신 람다와 같은 트릭을하려했지만 작동하지 않았다.

답변

13

나는 pyCurl이 더 이상 원하는대로 StringIO로 기능하지 않는다고 생각한다. 해결책은 사용하는 것이다. . io.BytesIO 대신 그런 정보는 버퍼에 기록하고 문자열로 디코딩 얻을 수있는

대신 StringIO의 pycurl와 BytesIO 사용 :.

e = io.BytesIO() 
c.setopt(pycurl.WRITEFUNCTION, e.write) 
BytesIO 개체에서

디코딩 바이트 정보 :

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

원하는 모든 유형의 디코딩을 사용할 수 있지만 구문 분석 할 수있는 문자열 개체가 있어야합니다.

희망이 파이썬 3를 사용하는 사람들을 도움이

+0

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