2013-07-12 10 views
7

In python, ho creato una funzione per creare una directory se non esiste già.python: perché os.makedirs causa WindowsError?

def make_directory_if_not_exists(path): 
    try: 
     os.makedirs(path) 
     break  
    except OSError as exception: 
     if exception.errno != errno.EEXIST: 
      raise 

Su Windows, a volte mi metterò la seguente eccezione:

WindowsError: [Error 5] Access is denied: 'C:\\...\\my_path'

Sembra accadere quando la directory è aperta nel File Browser Windows, ma non riesco a riprodurre in modo affidabile . Quindi, invece, ho appena fatto la seguente soluzione.

def make_directory_if_not_exists(path): 
    while not os.path.isdir(path): 
     try: 
      os.makedirs(path) 
      break  
     except OSError as exception: 
      if exception.errno != errno.EEXIST: 
       raise 
     except WindowsError: 
      print "got WindowsError" 
      pass  

Che cosa sta succedendo qui, vale a dire quando non di Windows mkdir dare un tale errore di accesso? C'è una soluzione migliore?

+1

Da [Docs] (http://docs.python.org/2/library/os.html#os.makedirs): 'Solleva un'eccezione di errore se la directory leaf esiste già o non può essere creata. –

+0

@AshwiniChaudhary, lo so. Prendo già questa eccezione con 'except OSError'. Sto chiedendo di 'WindowsError'. – izak

risposta

1

Un po 'googling rivela che questo errore viene generato in vari contesti diversi, ma la maggior parte di essi ha a che fare con errori di autorizzazione. Potrebbe essere necessario eseguire lo script come amministratore oppure potrebbe essere aperto un altro programma utilizzando una delle directory che si sta tentando di utilizzare.

3

È necessario utilizzare OSError e IOError. Vedere this risposta, si usa qualcosa come:

def make_directory_if_not_exists(path): 
    try: 
     os.makedirs(path) 
    except (IOError, OSError) as exception: 
     if exception.errno != errno.EEXIST: 
      ... 
-1

sulla tua domanda su una soluzione migliore userei semplice e chiaro il codice tre linee qui:

def make_directory_if_not_exists(path): 
    if not os.path.isdir(path): 
     os.makedirs(path) 
Problemi correlati