2013-10-26 1 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を使用する:。。BytesIOオブジェクトから

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

デコードバイト情報:

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

任意のタイプのデコードを使用できますが、解析できる文字列オブジェクトが必要です。

希望これは、Python 3を使用している人々を助け

+0

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

関連する問題