Domanda

Come faccio a cancellare un trasferimento in pycurl? io uso per tornare -1 in libcurl ma pycurl doesnt sembrano così ( "pycurl.error: valore di ritorno valida per la richiamata scrittura -1 17") return 0 non funziona neanche, ottengo "Errore: (23, 'il corpo di scrittura non riuscita ')". Inoltre come faccio a fare un blocco try / tranne che con pycurl? Non vedo alcun esempi online, né gli esempi pycurl dal sito

È stato utile?

Soluzione

Esempio di codice aiuterebbe qui. A giudicare dal messaggio di errore, e grep per esso nel codice sorgente, hai impostato una richiamata scrittura. Questo è configurato, credo, da CURLOPT_WRITEFUNCTION, e la documentazione per che dice:

  

Restituisce il numero di byte effettivamente   curato. Se tale quantità differisce   dall'importo passato al   la funzione, sarà segnalare un errore al   biblioteca e si interrompe il trasferimento   e restituire CURLE_WRITE_ERROR.

Il codice pycurl involucro controlla che il valore è compreso tra 0 e il numero passato a esso. Ecco perché -1 fallito, e perché 0, innesca CURLE_WRITE_ERROR, solleva l'eccezione "Impossibile scrivere il corpo". Il codice 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;
 }

Non vedo alcun modo in pycurl per questa funzione per sostenere un altro valore di ritorno. Ci potrebbero essere altri modi, come la creazione di un callback progresso, che non sembra permettere di interrompere la.

Il codice rilevante ricciolo per sé è:

/* 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;
}

in modo da poter vedere che pycurl non supporta la restituzione del CURL_WRITEFUNC_PAUSE che si arricciare permette. Si può anche vedere che l'arricciatura non ha modo di sostenere interrompe attraverso la funzione di callback di scrittura. Si dovrà utilizzare qualcos'altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top