我只是想处理上传的文件,并将它写入一个以系统时间戳为名称的工作目录中。问题是,我想使用完全权限 (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)
os.makedirs
函数的模式参数在某些系统上可能被忽略,并且在不忽略该参数的系统上,当前的 umask 值将被掩码。无论哪种情况,您都可以使用 os.chmod
函数强制将模式设置为 0o777(0777 会引发语法错误)。os.umask(0)
,以移除当前用户的掩码。参见:https://dev59.com/6m435IYBdhLWcg3wvy6_#67723702 - veben你遇到了问题,因为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。
original_umask = os.umask(0)
这行代码不应该放在 try
块内,而是应该放在 try
块之前。否则,如果它引发异常,finally
块可能会产生意外的结果。 - Joe Marley对于 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
macOS
上真正有效的方式。 - WestCoastProjects对于我来说,其他答案并没有起作用(使用的是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)