2013-03-02 18 views
7

Ho una connessione FTP da cui sto scaricando molti file e li sto elaborando in mezzo. Mi piacerebbe essere in grado di verificare che la mia connessione FTP non è scaduta nel mezzo. Quindi il codice simile a:Controllo di una connessione FTP Python

conn = FTP(host='blah') 
conn.connect() 
for item in list_of_items: 
    myfile = open('filename', 'w') 
    conn.retrbinary('stuff", myfile) 
    ### do some parsing ### 

Come posso controllare la mia connessione FTP nel caso in cui timeout durante la linea ### do some parsing ###?

risposta

17

Invia un comando NOOP. Questo non fa altro che controllare che la connessione stia andando ancora e se lo fai periodicamente può mantenere la connessione attiva.

Ad esempio:

conn.voidcmd("NOOP") 

Se c'è un problema con la connessione allora l'oggetto FTP sarà un'eccezione. Si può vedere dal documentation che le eccezioni sono gettati se c'è un errore:

socket.error e IOError:. Questi sono sollevate dalla connessione socket e sono molto probabilmente quelli che vi interessano

exception ftplib.error_reply: Eccezione sollevata quando viene ricevuta una risposta imprevista dal server.

exception ftplib.error_temp: Eccezione sollevata quando viene ricevuto un codice di errore che indica un errore temporaneo (codici di risposta nell'intervallo 400-499).

exception ftplib.error_perm: Eccezione sollevata quando viene ricevuto un codice di errore che indica un errore permanente (codici di risposta nell'intervallo 500-599).

eccezione ftplib.error_proto: Eccezione sollevata quando viene ricevuta una risposta dal server che non si adatta alle caratteristiche di risposta del File Transfer Protocol, cioè inizia con un numero nel range 1-5.

Pertanto è possibile utilizzare uno try-catch block per rilevare l'errore e gestirlo di conseguenza.

Per esempio, questo esempio di codice prenderà un IOError, dirvi su di esso e poi ripetere l'operazione:

retry = True 
while (retry): 
    try: 
     conn = FTP('blah') 
     conn.connect() 
     for item in list_of_items: 
      myfile = open('filename', 'w') 
      conn.retrbinary('stuff', myfile) 
      ### do some parsing ### 

     retry = False 

    except IOError as e: 
     print "I/O error({0}): {1}".format(e.errno, e.strerror) 
     print "Retrying..." 
     retry = True 
+0

'ftplib' sembra non adattarsi al principio Pythonic che ci dovrebbe essere un modo più ovvia da fare qualcosa - o almeno dovresti darmelo su 'voidcmd ('NOOP')' – Axeman