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

68

我只是想处理上传的文件,并将它写入一个以系统时间戳为名称的工作目录中。问题是,我想使用完全权限 (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)

你遇到了什么错误? - Ikke
3
我只是获取了目录,但权限不正确(755而不是777)。 - green69
3
无论你想要完成什么任务,“chmod 0777”都是错误和不安全的,你应立即还原到合理的权限设置,如果你不能确保不应该拥有覆盖系统文件权限的用户没有利用你所创建的安全漏洞,则最坏情况下需要重新安装系统。 - tripleee
4个回答

49
根据官方 Python 文档os.makedirs 函数的模式参数在某些系统上可能被忽略,并且在不忽略该参数的系统上,当前的 umask 值将被掩码。无论哪种情况,您都可以使用 os.chmod 函数强制将模式设置为 0o777(0777 会引发语法错误)。

13
当出现意外的权限时,“umask”通常是罪魁祸首。 - S.Lott
我同意,问题可能是umask - 这个诊断可能不正确。 - dbn
1
@dbw 我倾向于认同当前umask设置可能是问题的原因,这就是为什么我在我的回答中提到了umask - 然后描述了使用chmod的替代解决方案。 - srgerg
0777 抛出了一个语法错误: 你是在 py3 环境中运行的吗?在 py3 中,八进制表示已经发生了变化。 - Priyansh Agrawal
需要在之前加上 os.umask(0),以移除当前用户的掩码。参见:https://dev59.com/6m435IYBdhLWcg3wvy6_#67723702 - veben

44

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


2
稍作更正:umask 不是文件或目录的属性,而是由运行进程设置的。通常 umask 会从 shell 继承。 - Sundae
1
谢谢,Sundae - 验证和更新。 - dbn
1
我想在 /var 目录下创建一个文件夹。但是,如果我尝试使用上述代码,我会遇到“权限被拒绝:'/var/test'” 的问题。 - Manjunath Raddi
3
original_umask = os.umask(0) 这行代码不应该放在 try 块内,而是应该放在 try 块之前。否则,如果它引发异常,finally 块可能会产生意外的结果。 - Joe Marley
3
对于py3环境,0XYZ(八进制数)需要写成0oXYZ。 - Priyansh Agrawal
显示剩余2条评论

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

我无法在“/var/”目录下创建“test”目录。 - Manjunath Raddi
我尝试了很多方法 - 这是唯一在macOS上真正有效的方式。 - WestCoastProjects

6

对于我来说,其他答案并没有起作用(使用的是python 2.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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接