2013-07-12 3 views
7

В python я создал функцию, чтобы сделать каталог, если он еще не существует.python: почему os.makedirs вызывают WindowsError?

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

В Windows, иногда я получаю следующее исключение:

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

Это, кажется, случается, когда каталог открыт в File Browser Windows, но я не могу достоверно воспроизвести , Поэтому вместо этого я сделал следующее обходное решение.

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  

Что здесь происходит, то есть, когда делает для Windows mkdir дают такую ​​ошибку доступа? Есть ли лучшее решение?

+1

С [документы] (HTTP://docs.python.org/2/library/os.html#os.makedirs): 'вызывает исключение ошибки, если каталог листьев уже существует или не может быть создан.' –

+0

@AshwiniChaudhary, я знаю. Я уже поймаю это исключение с помощью 'except OSError'. Я спрашиваю о 'WindowsError'. – izak

ответ

1

Небольшой поиск в Google показывает, что эта ошибка возникает в разных контекстах, но большинство из них связано с ошибками разрешений. Возможно, сценарий должен запускаться как администратор, или может быть другая программа открыта с использованием одной из каталогов, которые вы пытаетесь использовать.

3

Вы должны использовать OSError, а также IOError. См this ответ, вы будете использовать что-то вроде:

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

на ваш вопрос о лучшем решении я хотел бы использовать простые и понятные три строки кода здесь:

def make_directory_if_not_exists(path): 
    if not os.path.isdir(path): 
     os.makedirs(path) 
Смежные вопросы