Проблемы с разрешением при создании каталога с os.makedirs в Python

20


Я просто пытаюсь обрабатывать загруженный файл и записывать его в рабочий каталог, имя которого является системной меткой времени. Проблема в том, что я хочу создать этот каталог с полным разрешением (777), но я НЕ МОГУ! Используя следующий фрагмент кода, созданный каталог имеет 755 разрешений.

def handle_uploaded_file(upfile, cTimeStamp):
    target_dir = "path_to_my_working_dir/tmp_files/%s" % (cTimeStamp)
    os.makedirs(target_dir, mode=0777)

Кто-нибудь может мне помочь? Большое спасибо.

    
задан green69 08.03.2011 в 12:35
источник
  • Какая ошибка вы получаете? –  Ikke 08.03.2011 в 12:37
  • Я просто получаю каталог, но с неправильными разрешениями (755 вместо 777). –  green69 08.03.2011 в 12:38

3 ответа

26

В соответствии с официальной python документацией аргумент режима функции os.makedirs может игнорироваться на некоторых системах , и в системах, где он не игнорируется, текущее значение umask маскируется.

В любом случае, вы можете принудительно отключить режим 0o777 (0777 запустили синтаксическую ошибку), используя функцию os.chmod .

    
ответ дан srgerg 08.03.2011 в 12:44
источник
  • +1: umask часто является виновником появления неожиданных разрешений. –  S.Lott 08.03.2011 в 12:45
  • Я согласен, проблема, вероятно, umask - этот диагноз, вероятно, неверен. –  dbn 16.05.2014 в 22:37
  • @dbw Я склонен согласиться с тем, что текущая настройка umask, вероятно, является причиной проблемы, поэтому я упомянул umask в своем ответе - прежде чем описывать альтернативное решение с помощью chmod. –  srgerg 17.05.2014 в 03:31
  • err. правильно. Мне нужно научиться читать. благодаря –  dbn 17.05.2014 в 04:34
17

У вас возникают проблемы, потому что os.makedir () отличает umask текущего процесса ( см. документы, здесь ). Если вы хотите игнорировать umask, вам нужно сделать что-то вроде следующего:

import os
try:
    original_umask = os.umask(0)
    os.makedirs('full/path/to/new/directory', desired_permission)
finally:
    os.umask(original_umask)

В вашем случае вы захотите, чтобы desired_permission было 0777 (восьмеричное, а не строка). Большинство других пользователей, вероятно, захотят получить 0755 или 0770.

    
ответ дан dbn 16.05.2014 в 22:36
источник
  • Небольшая коррекция: umask не является свойством файлов или каталогов, он задается текущим процессом. Обычно umask наследуется от оболочки. –  Sundae 07.03.2016 в 13:30
  • Спасибо, sundae - проверка и обновление. –  dbn 07.03.2016 в 20:31
  • @dbw Ничего себе, все работает как ожидается, изменив umask :) НО есть ли риск этого? –  user3366706 01.04.2016 в 01:29
  • Я хотел бы создать каталог внутри / var. Но если я попытался выполнить код, на который я сталкиваюсь, Permission denied: '/ var / test' –  Manjunath Raddi 24.04.2017 в 07:57
  • @Manjunath - ваш пользователь должен иметь разрешение на запись в родительскую папку. Обычно только root имеет разрешение на запись в / var. –  dbn 24.04.2017 в 18:51
10

Для систем Unix (когда режим не игнорируется) предоставленный режим сначала маскируется с помощью umask текущего пользователя. Вы также можете исправить umask пользователя, который запускает этот код. Тогда вам не придется вызывать метод os.chmod() . Обратите внимание: если вы не установите umask и создайте несколько каталогов с методом os.makedirs , вам придется идентифицировать созданные папки и применить к ним os.chmod .

Для меня я создал следующую функцию:

def supermakedirs(path, mode):
    if not path or os.path.exists(path):
        return []
    (head, tail) = os.path.split(path)
    res = supermakedirs(head, mode)
    os.mkdir(path)
    os.chmod(path, mode)
    res += [path]
    return res
    
ответ дан user2120286 04.06.2013 в 14:51
источник
  • Я не могу создать 'test' каталог внутри '/ var /'. –  Manjunath Raddi 24.04.2017 в 13:54