2009-08-10 7 views
3

J'ai un script Python qui utilise extensivement shutil.copy2. Depuis que je l'utilise pour copier des fichiers sur le réseau, je reçois des erreurs d'E/S trop fréquentes qui conduisent à l'avortement de l'exécution de mon programme:Éviter une sortie de programme sur une erreur d'E/S

Traceback (most recent call last): 
    File "run_model.py", line 46, in <module> 
    main() 
    File "run_model.py", line 41, in main 
    tracerconfigfile=OPT.tracerconfig) 
    File "ModelRun.py", line 517, in run 
    self.copy_data() 
    File "ModelRun.py", line 604, in copy_ecmwf_data 
    shutil.copy2(remotefilename, localfilename) 
    File "/usr/lib64/python2.6/shutil.py", line 99, in copy2 
    copyfile(src, dst) 
    File "/usr/lib64/python2.6/shutil.py", line 54, in copyfile 
    copyfileobj(fsrc, fdst) 
    File "/usr/lib64/python2.6/shutil.py", line 27, in copyfileobj 
    buf = fsrc.read(length) 
IOError: [Errno 5] Input/output error 

Comment puis-je éviter l'avortement de l'exécution de mon programme et l'ont retenter le processus de copie à la place?

Le code que je vérifie à l'aide déjà que le fichier est effectivement copié complètement en cochant la taille du fichier:

def check_file(file, size=0): 
    if not os.path.exists(file): 
     return False 
    if (size != 0 and os.path.getsize(file) != size): 
     return False 
    return True 

while (check_file(rempdg,self._ndays*130160640) is False): 
    shutil.copy2(locpdg, rempdg) 

Répondre

7

Quel bloc i s donner l'erreur? Il suffit de l'entourer d'un try/except:

def check_file(file, size=0): 
    try: 
     if not os.path.exists(file): 
      return False 
     if (size != 0 and os.path.getsize(file) != size): 
      return False 
     return True 
    except IOError: 
     return False # or True, whatever your default is 

while (check_file(rempdg,self._ndays*130160640) is False): 
    try: 
     shutil.copy2(locpdg, rempdg) 
    except IOError: 
     pass # ignore the IOError and keep going 
6

vous pouvez utiliser

try: 
    ... 
except IOError as err: 
    ... 

pour attraper les erreurs et les traiter

Regardez this

Questions connexes