使用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)
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 会导致语法错误)。