Проблемы с разрешением при создании каталога с 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)
Кто-нибудь может мне помочь? Большое спасибо.
Ответы
Ответ 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