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!
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
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
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