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

2024-06-26 17:39:45 发布

您现在位置: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)

有人能帮我吗?非常感谢。


Tags: 文件path代码目录权限target系统def
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

根据官方的pythondocumentation,在某些系统上,os.makedirs函数的mode参数可能会被忽略,在不被忽略的系统上,当前umask值会被屏蔽。

不管怎样,都可以使用os.chmod函数强制模式为0o777(0777抛出语法错误)。

您遇到了问题,因为os.makedir()尊重当前进程(see the docs, here)的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_permission0777(八进制,而不是字符串)。大多数其他用户可能需要0755或0770。

相关问题 更多 >