Подтвердить что ты не робот

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


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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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