16

ebay SDK を python3 に移植していますが、次の問題に遭遇しました。

pycurl を使用して HTTP リクエストを送信しています。設定方法は次のとおりです。

    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)

そしてそれは動作します。ラムダで同じトリックを実行しようとしました (これらの厄介な関数を定義する代わりに、うまくいきませんでした.

4

1 に答える 1

36

問題は、pycurl が StringIO で機能しなくなったことだと思います。解決策は、代わりに io.BytesIO を使用することです。その後、バッファに書き込まれた情報を取得し、それを文字列にデコードできます。

StringIO の代わりに pycurl で BytesIO を使用する:

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

BytesIO オブジェクトからのバイト情報のデコード:

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

任意のタイプのデコードを使用できますが、これにより、解析可能な文字列オブジェクトが得られるはずです。

これが Python 3 を使用している人々に役立つことを願っています。

于 2014-05-12T13:23:30.793 に答える