2011-02-24 23 views
3

pythonで大量のデータを書き込み関数(CURLOPT_WRITEFUNCTION)に出力するカール要求があります。私は、特定の条件が満たされた場合に、write関数からcurl要求を取り消すことができるようにします。私はch.close()を使用しようとしましたが、実行中に要求を閉じることができないというエラーです。書き込み関数からの停止を得る他の方法は? HERESに私のコード:あなたの書き込み機能から返された数は、それはそう-1を返すか、あなたの書き込み機能は、それが原因となります内の例外を上げ、書き込みだと思っ数に等しくない場合WRITEFUNCTIONからカールリクエストをキャンセルするにはどうすればよいですか?

self.ch = pycurl.Curl() 

    self.ch.setopt(pycurl.URL, file_url) 
    self.ch.setopt(pycurl.CONNECTTIMEOUT, 60) 
    self.ch.setopt(pycurl.WRITEFUNCTION, self.WriteWrapper) 
    self.ch.setopt(pycurl.HEADERFUNCTION, self.ParseHeaders) 
    self.ch.setopt(pycurl.FOLLOWLOCATION, True) 
    self.ch.setopt(pycurl.COOKIE, cookies[file_host]) 
    self.ch.setopt(pycurl.HTTPHEADER, self.headers_received) 

    self.ch.perform() 
    self.ch.close() 


def do_POST(self): 
    return self.do_GET() 

def WriteWrapper(self, data): 
    if self.do_curl_request: 
     try: 
      return self.wfile.write(data) 
     except: 
      self.ch.close() # This doesn't work :(
+0

ちょうどここに推測すると解釈されていないことに注意してください、おそらく 'NONE'を返します? – thirtydot

答えて

2

pycurlにエラーが発生pycurl.errorを上げる。 ([これに]ベース(http://pycurl.sourceforge.net/doc/callbacks.html))を返す 'なし' が'all bytes written'.

>>> class Writer: 
... def __init__(self): 
...  self.count = 0 
... def write(self, data): 
...  print "Write called", len(data) 
...  return -1 
... 
>>> curl = pycurl.Curl() 
>>> writer = Writer() 
>>> curl.setopt(pycurl.WRITEFUNCTION, writer.write) 
>>> curl.setopt(pycurl.URL, "file:///some_big_file.txt") 
>>> curl.perform() 
Write called 16383 
pycurl.error: invalid return value for write callback -1 16383 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
pycurl.error: (23, 'Failed writing body (0 != 16383)') 
関連する問題