[PIPython] script ftp

N. Wieland nicholas
Ven 19 Nov 2004 15:16:38 CET


Ciao Riccardo ... dimmi che non ti ho detto python.it ma zope.it ...
Beh, se ti ho detto python.it ho sbagliato, la ML per i mantovani e' su
Zope.it, e questa al momento e' la lista dedicata alla ricostruzione del
sito python.it ...

- riccardo.gaggero a sogefifiltration.com :
> Sto iniziando a usare python e volevo crearmi uno script ftp client in cui
> paramentrizzo i miei dati e debba passargli solo il file origine e quello
> destinazione
> la cosa funziona ma l'eccezione degli errori per niente 
> se sbaglio l'inserimento del file mi ritorna il codice del programma con gli
> evventuali errori mentre io vorrei che mi uscisse dallo script e basta..
> 
> dove sbaglio??
> e la starda giusta quella dell'uso delle ftplib ??

Si, devi usare le ftplib :)

> """ Script ftp client """
> import time
> import commands
> LOG_PATH = 'c:/log/'                #Path del log file
> FTP_ADDR = '10.0.2.122'             #indirizzo IP della macchina remota
> FTP_USER = 'xx'                #ftp username
> FTP_PWD = 'xx'                     #ftp password
> FTP_REMOTE_DIR = '/home/ced_rik/'   #dir remota
> PATH_OUTPUT_FTP_FILE = "c:/log/"    #Path del file scaricati

Programmi in C vero ? :)
Non c'e assolutamente bisogno di queste "macro", puoi tranquillamente
dare i parametri direttamente all'interno dello script.
Importa tutto all'inizio, non c'e' bisogno di importare in un secondo
tempo rendendo il tutto meno leggibile. Tanto non ti cambia la vita.
 
> def dataodierna():
>     # Ritorna una stringa con la data di oggi in formato GGMMAA
>     data = time.strftime('%d%m%y',time.localtime(time.time()))
>     return data
> def updatelog(messaggio):
>     # Stampa un messaggio a video e salva un log delle operazioni
>     print 'log> '+messaggio
>     timenowstr = time.asctime(time.localtime(time.time()))
>     msgwrite = timenowstr + ": " + messaggio + '\n'
>     filelog = open(LOG_PATH+'log_ftp.txt','a')
>     filelog.write(msgwrite)
>     filelog.close()
> def spawntarfile(ftp_file):
>     # Esegue un FTP su una macchina remota e copia l'archivio
>     updatelog('- inizio connessione ftp con '+FTP_ADDR)
>     try:
>         from ftplib import FTP

Questo e' male. Non usare questa sintassi, anche se c'e' sul manuale.
E' rischiosa, e fuori dalla libreria standard puo' darti problemi ...

>         ftp = FTP(FTP_ADDR)
>         updatelog('- connesso. Invio login...')
>         ftp.login(FTP_USER,FTP_PWD)
>         updatelog('- logged. Ricezione file...')

Puoi farlo piu' conciso, come ti ho mostrato sulla ML del LUG, dando
subito username e password.
Simple is better than complex (cfr. import this :)

> #        ftp.retrbinary('RETR '+ftp_file, open(PATH_OUTPUT_FTP_FILE + ftp_file, 'wb').write)
>         ftp.retrlines('RETR '+ftp_file, open(PATH_OUTPUT_FTP_FILE+ftp_file,
> 'wb').write)
>     except (ftplib.error_perm, ftplib.error_temp,ftplib.error_reply,
> ftplib.error_proto):
>         updatelog('- errore nella ricezione FTP. Abbandono la sessione.')
>         #mettere qui il richiamo ad una routine per la gestione sistematica
> degli errori di connessione FTP, dei retry e degli abort.
>         ftp.quit()
>     else:
>         updatelog('- chiusura FTP')
>         updatelog('- copiato '+ ftp_file+' in '+
> PATH_OUTPUT_FTP_FILE+ftp_file)
>         ftp.quit()

Puoi usare all_errors anziche' specificarli tutti.

> if __name__ == '__main__':
>     print('\n\Script FTP')
>     print('EDP Team\n\n')
>     updatelog('- inizio operazioni')
> from ftplib import FTP
> ftp = FTP(FTP_ADDR)
> ftp.login(FTP_USER,FTP_PWD)
> ftp.retrlines('LIST')     
> ftp.quit()
> INPUT_FILE = raw_input  ("Digitare il file di scaricare: ")
> spawntarfile(INPUT_FILE)
> #commands.getoutput('rm '+bakfilename)... volendo.
> updatelog('- fine operazioni\n\n')

Qui rifai tutto da capo, e' un bel casino ...
Ci dici anche che eccezione solleva, cosi' sappiamo localizzare meglio
il problema ?

	nicholas



More information about the Python mailing list