1

如何在 pycurl 中取消转账?我曾经在 libcurl 中返回 -1,但 pycurl 似乎不喜欢那样(“pycurl.error:写入回调的无效返回值 -1 17”)返回 0 也不起作用,我得到“错误:(23,'写入正文失败')”。另外,我如何使用 pycurl 进行尝试/除外?我没有在网上看到任何示例,也没有从网站上看到 pycurl 示例

4

1 回答 1

3

示例代码在这里会有所帮助。从错误消息来看,并在源代码中查找它,您已经设置了一个写入回调。我认为这是由 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 中看不到此函数支持另一个返回值的任何方法。可能还有其他方法,例如设置进度回调,这似乎确实允许中止。

curl本身的相关代码是:

/* 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 本身允许的 CURL_WRITEFUNC_PAUSE 。您还可以看到 curl 无法通过 write 回调函数支持中止。您将不得不使用其他东西。

于 2009-03-07T23:14:21.810 回答