我只是试图处理上传的文件并将其写入名称为系统时间戳的工作目录中。问题是我想创建具有完全权限(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文档,函数的 mode 参数os.makedirs
在某些系统上可能会被忽略,而在未被忽略的系统上,当前的 umask 值会被屏蔽掉。
os.chmod
无论哪种方式,您都可以使用该函数将模式强制为 0o777(0777 引发语法错误) 。
您遇到问题是因为 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。
对于 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
其他 anwsers 对我不起作用(使用 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)