如何取消在pycurl转移?我使用返回-1 libcurl中,但pycurl不似乎喜欢(“pycurl.error:无效的返回值写入回调-1 17”)返回0不工作要么,我得到“错误:(23“无法写体“)”。另外我该怎么做试一试/除非pycurl?我没有看到任何在线例子也不是pycurl例子从网站

有帮助吗?

解决方案

实施例的代码,将有助于在这里。从错误信息来看,和源代码grepping它,你已经设置了写回调。此配置,我认为,通过CURLOPT_WRITEFUNCTION,以及用于该文档说:

  

返回的字节的数量实际上   已搞定。如果金额不同   从传递给你的金额   功能,它会发出错误信号的   图书馆,它将中止传送   并返回CURLE_WRITE_ERROR。

在pycurl包装代码检查值是0,并且传递给它的数量之间。这就是为什么-1失败了,为什么0,触发CURLE_WRITE_ERROR,引发“无法书写体”异常。的pycurl代码是:

 /* run callback */
 arglist = Py_BuildValue("(s#)", ptr, total_size);
 if (arglist == NULL)
     goto verbose_error;
 result = PyEval_CallObject(cb, arglist);
 Py_DECREF(arglist);
 if (result == NULL)
     goto verbose_error;

 /* handle result */
 if (result == Py_None) {
     ret = total_size;           /* None means success */
 }
 else if (PyInt_Check(result)) {
     long obj_size = PyInt_AsLong(result);
     if (obj_size < 0 || obj_size > total_size) {
         PyErr_Format(ErrorObject, "invalid return value for write callback %ld %ld", (long)obj_size, (long)total_size);
         goto verbose_error;
     }
     ret = (size_t) obj_size;    /* success */
 }
 else if (PyLong_Check(result)) {
      ... identical code for Long ...
 }
 else {
     PyErr_SetString(ErrorObject, "write callback must return int or None");
     goto verbose_error;
 }

我看不到任何pycurl的方式为这个功能支持其它的返回值。可能有其他的方法,比如设置了一个进度回调,这似乎允许中止。

在卷曲本身相关的代码是:

/* If the previous block of data ended with CR and this block of data is
   just a NL, then the length might be zero */
if(len) {
  wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);
}
else {
  wrote = len;
}

if(CURL_WRITEFUNC_PAUSE == wrote)
  return pausewrite(data, type, ptr, len);

if(wrote != len) {
  failf(data, "Failed writing body (%d != %d)", (int)wrote, (int)len);
  return CURLE_WRITE_ERROR;
}

所以你可以看到,pycurl不支持返回其卷曲本身CURL_WRITEFUNC_PAUSE允许。你也可以看到,卷曲没有办法支持通过写回调函数中止。你将不得不使用别的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top