56

我只是试图处理上传的文件并将其写入名称为系统时间戳的工作目录中。问题是我想创建具有完全权限(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

4 回答 4

43

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

os.chmod无论哪种方式,您都可以使用该函数将模式强制为 0o777(0777 引发语法错误) 。

于 2011-03-08T11:44:08.143 回答
39

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

于 2014-05-16T20:36:27.823 回答
14

对于 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
于 2013-06-04T12:51:42.713 回答
0

其他 anwsers 对我不起作用(使用 python 2.7)。

我之前必须添加os.umask(0),以删除当前用户的掩码。我不得不将模式从更改07770o777

def handle_uploaded_file(upfile, cTimeStamp):
    target_dir = "path_to_my_working_dir/tmp_files/%s" % (cTimeStamp)
    os.umask(0)
    os.makedirs(path, mode=0o777)
于 2021-05-27T13:58:04.550 回答