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

在Python中使用os.makedirs创建目录时出现权限问题,python,python-2.7,Python,Python 2.7,我只是试图处理一个上传的文件,并将其写入一个名为系统时间戳的工作目录中。问题是我想创建具有完全权限的目录(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) 根据

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

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

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

对于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

您遇到了问题,因为os.makedir()接受当前进程()的umask。如果要忽略umask,必须执行以下操作:

导入操作系统
尝试:
原始_umask=os.umask(0)
os.makedirs('full/path/to/new/directory',所需的权限)
最后:
os.umask(原版)

在您的情况下,您需要
所需的\u权限
成为
0777
(八进制,而不是字符串)。大多数其他用户可能需要0755或0770。

其他Anwser不适合我(使用python2.7

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

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)

您得到的错误是什么?我只是得到了目录,但使用了错误的权限(755而不是777)。无论您希望获得什么,
chmod 0777
都是错误和不安全的,您应该立即恢复到正常权限,或者,在最坏的情况下,如果您无法确保无法覆盖系统文件的用户没有滥用您创建的安全漏洞,请重新安装您的系统。+1:
umask
通常是出现意外权限时的罪魁祸首。我同意,问题可能是umask-此诊断可能不正确。@dbw我倾向于同意当前的umask设置可能是问题的原因,这就是为什么我在回答中提到了umask-在描述使用chmod的替代解决方案之前。>>0777抛出了一个语法错误:您是在py3环境中运行的吗?py3中的八进制表示已更改。之前需要
os.umask(0)
删除当前用户的掩码。请参阅:轻微更正:umask不是文件或目录的属性,它是由正在运行的进程设置的。通常umask是从shell继承的。谢谢,sundae-验证和更新。@dbw-Wow,通过更改umask:)一切正常,但这样做有风险吗?我想在/var内创建目录。但如果我尝试上述代码,我将面临权限被拒绝的情况:'/var/test'@Manjunath-您的用户需要有在父文件夹中写入的权限。通常只有root在
/var
中有写权限。我无法在“/var/”中创建“test”目录。