如何在pycurl中取消传输?我在libcurl中使用返回-1但pycurl似乎不喜欢(“pycurl.error:写回调-117的无效返回值”)返回0也不起作用,我得到“错误:(23,'写入正文失败')“。另外我如何尝试/除了pycurl?我没有在网上看到任何例子,也没有看到网站上的pycurl例子
答案 0 :(得分:3)
示例代码在这里会有所帮助。从错误消息判断,并在源代码中对它进行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本身允许的CURL_WRITEFUNC_PAUSE。您还可以看到curl无法通过write回调函数支持中止。你将不得不使用别的东西。