使用os.makedirs在Python中创建目录时的权限问题

69 投票
4 回答
154429 浏览
提问于 2025-04-16 13:15

我只是想处理一个上传的文件,并把它写入一个以系统时间戳命名的工作目录。问题是我想创建这个目录时赋予它完全的权限(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)

4 个回答

15

在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
45

你遇到的问题是因为 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。

51

根据官方的 Python 文档,在某些系统上,os.makedirs 函数的模式参数可能会被忽略。而在那些没有被忽略的系统上,当前的 umask 值会影响这个参数。

无论如何,你可以使用 os.chmod 函数强制设置模式为 0o777(0777 会导致语法错误)。

撰写回答