2010-01-17 7 views
3

Avec le code suivant, je télécharge file.txt sur un serveur ftp. Lorsque le fichier a été téléchargé, je le supprime sur ma machine locale.ftplib en combinaison avec os.unlink en python

import os 
from ftplib import FTP 

HOST = 'host.com' 
FTP_NAME = 'username' 
FTP_PASS = 'password' 
filepath = 'C:\file.txt' 
while True: 
    try: 
     ftp = FTP(HOST) 
     ftp.login(FTP_NAME, FTP_PASS) 
     file = open(filepath, 'r') 
     ftp.storlines('STOR file.txt', file) 
     ftp.quit() 
     file.close() # from this point on the file should not be in use anymore 
     print 'File uploaded, now deleting...' 
    except all_errors as e: #EDIT: Got exception here 'timed out' 
     print 'error'  #  then the upload restarted. 
     print str(e) 

os.unlink(filepath) # now delete the file 

Le code fonctionne, mais parfois (tous les ~ 10 upload) je reçois ce message d'erreur:

Traceback (most recent call last): 
in os.unlink(filepath) 
WindowsError: [Error 32] The process cannot access the file 
because it is being usedby another process: 'C:\file.txt' 

Ainsi, le fichier ne peut pas être supprimé car « il n'a pas été libéré » ou quelque chose? J'ai aussi essayé de dissocier le fichier de cette façon:

while True: # try to delete the file until it is deleted... 
    try: 
     os.unlink(filepath) 
     break 
    except all_errors as e: 
     print 'Cannot delete the File. Will try it again...' 
     print str(e) 

Mais avec le « essayer except » Je reçois aussi la même erreur « Le processus ne peut pas accéder au fichier car il est Usedby un autre processus »! Le script n'a même pas essayé d'imprimer l'exception:

'Cannot delete the File. Will try it again...' 

et juste arrêté (comme ci-dessus).

Comment puis-je faire fonctionner correctement os.unlink? Merci!

+0

Etes-vous sûr que le fichier n'est pas ouvert dans un éditeur de texte? ou était ouvert et l'éditeur de texte n'est toujours pas fermé? – SilentGhost

+0

désolé j'oublie que j'ai utilisé une boucle while dans ftplib! Dunno si c'est pertinent, mais j'ai eu une exception "expiré" après le stockage, puis le ftpupload a redémarré. APRES que le fichier os.unlink n'a pas fonctionné (processus utilisé ...) – creativz

+0

Qu'est-ce que 'all_errors' exactement? Si 'WindowsError' (ni une superclasse) n'y figure pas, c'est pourquoi l'exception n'est pas interceptée. – balpha

Répondre

0
import os 
from ftplib import FTP 

HOST = 'host.com' 
FTP_NAME = 'username' 
FTP_PASS = 'password' 
filepath = 'C:\file.txt' 
file = open(filepath, 'r') 
while True: 
    try: 
     ftp = FTP(HOST) 
     ftp.login(FTP_NAME, FTP_PASS)   
     ftp.storlines('STOR file.txt', file) 
    except all_errors as e: #EDIT: Got exception here 'timed out' 
     print 'error'  #  then the upload restarted. 
     print str(e) 
    else: 
     ftp.quit() 
     file.close() # from this point on the file should not be in use anymore 
     print 'File uploaded, now deleting...' 
     os.unlink(filepath) # now delete the file 
     break 
0

Vous devez fermer (fichier et session ftp) sur la jambe except du try/except, sinon le fichier continue à être référencé par la « vieille » session ftp chronométré-out (donc par conséquent vous avez besoin pour ouvrir le fichier dans la boucle while, pas à l'extérieur) - il ne suffit pas de fermer le fichier et la session ftp sur la jambe else car cela ne supprime pas les références des tentatives échouées et expirées (le cas échéant) .

+0

Est-ce que je peux mettre tout mon code ftpupload dans un nouveau def et os.unlink en dehors du def (ou même dans un autre def)? Est-ce que cela résout le problème de la session ftp? – creativz

+0

@creativz, tant que vous vous assurez que le fichier et la session ftp sont fermés inconditionnellement (y compris lorsque des délais d'attente se produisent), il sera bon qu'ils soient dans la même fonction ou dans une autre. –

0

J'ai encore des problèmes avec le code, il n'est pas aussi robuste que j'en ai besoin. Par exemple, il est possible que le processus de connexion échoue. Peut-être que l'utilisateur + passe est faux, peut-être que le sonrver est occupé.

try: 
    ftp = FTP(HOST) # HOST is a valid host address 
    ftp.login('test', 'test111111') # WRONG user + pass to test code robustness 
    ftp.quit() 
except all_errors as e: 
    ftp.quit() 
    print str(e) 

Le problème est le ftp.quit() dans le bloc except. Python renvoie l'erreur suivante (PAS l'exception):

Traceback (most recent call last): 
    File "test.py", line 9, in <module> 
     ftp.quit() 
NameError: name 'ftp' is not defined 
Questions connexes