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

17


Я просто пытаюсь обрабатывать загруженный файл и записывать его в рабочий каталог, имя которого является системной меткой времени. Проблема в том, что я хочу создать этот каталог с полным разрешением (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
источник

3 ответа

21

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

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

    
ответ дан srgerg 08.03.2011 в 12:44
источник
10

У вас возникают проблемы, потому что 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
источник
8

Для систем 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
источник