2010-01-13 7 views
1

J'utilise ce code pour télécharger myfile.txt de ma machine Windows sur un serveur ftp. Après le chargement, le script supprime le fichier sur ma machine locale (je ne le supprime pas sur le ftp).ftplib STOR de Python fiable?

try: 
    ftp = FTP(ftp.host.com) 
    ftp.login(your_username, your_password) 
    file = open(myfile.txt, "rb") 
    ftp.storbinary('STOR myfile.txt', file) 
    print 'STORing File now...' 
    ftp.quit() 
    file.close() 
    subprocess.Popen('del myfile.txt', shell=True) 
    print 'File deleted' 
except all_errors: 
    print 'An error occured' 

Ce code s'exécute, mais ce n'est pas fiable! A chaque ~ 10ème téléchargement mon script se bloque pendant le stockage du fichier.

print 'STORing File now...' # So I just get 'STORING File now...' 

Le fichier n'est pas grand et devrait être mise en ligne en quelques secondes, mais je dois souvent attendre une heure ou deux et alors seulement l'exception est levée:

print 'An error occured' 

Si Faisaient exception jeté "plus tôt" ce serait bien que je puisse simplement redémarrer le téléchargement (par exemple dans une boucle while). Parce que j'ai besoin de ce fichier pour être téléchargé dès que possible, je dois accélérer le téléchargement du fichier (je ne veux pas attendre si l'exception est levée)

Deuxième problème: Parfois, cela arrive: Après le fichier a été téléchargé avec succès, le script ne parvient pas à supprimer le fichier sur ma machine locale car 'un autre processus y accède déjà' < - Je pense que ftplib n'a pas 'libéré' le fichier. Que puis-je faire pour éviter cela?

Je suis à la recherche d'une meilleure solution de fileupload simple/fiable. Quelqu'un a une idée? Merci!

+0

Dois-je faire le téléchargement de tout le fichier avec Windows ftp.exe (appelé avec sous-processus)? – creativz

Répondre

1

Pour obtenir l'exception plus tôt, utilisez socket.setdefaulttimeout: par exemple,

import socket 
socket.setdefaulttimeout(20.0) 

vous donnera une exception si une prise il a bloqué pendant 20 secondes.

Pour supprimer un fichier de votre script Pyton, utilisez os.unlink - bien mieux que de passer à un processus séparé pour un del.

+0

merci pour l'info os.unlink:> Donc par simple copier/coller votre socket d'importation de code; socket.setdefaulttimeout (20.0) ça devrait marcher? – creativz

+0

@creativz, si par "travail" vous voulez dire "lever une exception si un socket bloque pendant 20 secondes", oui, c'est exactement ce qu'il devrait faire. –

+0

ok, donc l'exception sera jeté dans mon «sauf» existant. Je vais le tester.Par ailleurs, j'ai modifié mon sauf à: sauf all_errors comme e: impression str (e) – creativz

2

Ne pas utiliser sous-processus à débourser pour supprimer un fichier - l'appel os.unlink vous permettra de le faire portably (la bibliothèque shutil comble les lacunes quand os échoue)

En ce moment, vous êtes gobbling l'erreur avec votre déclaration d'impression stupide - obtenir un retraçage de l'exception qui vous donnerait un grand nombre d'indices. Toutefois, votre problème est probablement lié à des problèmes de délai d'attente de socket - soit vous n'exécutez pas de FTP passif, soit le serveur est mal configuré et vous donne un numéro de port de connexion passif non valide (ce que son pare-feu bloque).

+0

donc avec un délai de socket publié (par Alex Martelli) Je devrais être capable de gérer le problème. Merci! – creativz

2

que diriez-vous

def upload(ftp, filename): 
    ftp.storbinary("STOR " + filename, open(filename, "rb"), 1024) 
try: 
    ftp = FTP("ftp.host.com") 
    ftp.login(your_username, your_password) 
except Exception,e: 
    print e 
else: 
    file = open("myfile.txt", "rb") 
    print 'STORing File now...' 
    try: 
     upload(ftp,file) 
    except Exception,e: 
     print e 
    else: 
     ftp.quit() 
     file.close() 
     try: 
      os.remove("myfile.txt") 
     except Exception,e: 
      print e 
     else: 
      print 'File deleted' 

rappelez-vous, Python a son propre module de suppression de fichier. ne pas appeler le système del inutilement