【问题标题】:change permission mode for new directories and files更改新目录和文件的权限模式
【发布时间】:2018-06-14 02:56:44
【问题描述】:

在 python 2.7 中,我将数据保存到路径,例如A/B/C/data.txt:

import os

file_path = 'A/B/C/data.txt'

# create directory A/B/C
dir_name = os.path.dirname(file_path)
if not os.path.exists(dir_name):
    os.makedirs(dirp_name)

# save data to file
with open(file_path, 'w') as f:
    json.dump(data, f)

# change file permission mode to be 0x666
os.chmod(file_path, 0666)

文件data.txt的权限模式已更改。但是,此代码不会更改路径上目录A/B/C 的权限模式。我也想设置目录的权限模式。

os.chmod('A', 0666)
os.chmod('A/B', 0666)
os.chmod('A/B/C', 0666)

有没有一种优雅的方式来做到这一点?

谢谢!

【问题讨论】:

  • 使用os.chmod
  • 如果问题是您的默认 umask,并且您想在整个进程范围内更改它而不是针对此目录,只需调用 umask。如果您希望在此目录中创建的文件比您的进程创建的其他文件更宽松,我认为没有任何方法可以像这样自动添加权限;您必须在打开文件后对其进行 fchmod。
  • 查看os.chmod() here的文档
  • os.chmod(file, mode) 将仅更改该特定文件的权限模式。但我想更改路径上所有目录的权限模式。
  • 问题已被编辑。抱歉之前的描述不准确。

标签: python linux unix chmod


【解决方案1】:

os.mkdir(path[, mode]) 允许我们在创建目录时设置权限模式。默认模式为 0777(八进制)。如果目录已经存在,则会引发 OSError。

解决方案 1:

# RW only permission mode is 0666 in python 2 and 0o666 in python 3
RW_only = 0666

# create directory A/B/C
dir_name = os.path.dirname(file_path)

if not os.path.exists(dir_name):
    os.makedirs(dirp_name, RW_only)

# save data to file
with open(file_path, 'w') as f:
    json.dump(data, f)

# change file permission mode to be 0x666
os.chmod(file_path, RW_only)

但是,从 python 3.7 开始,mode 参数不再影响新创建的中级目录的文件权限位,因此解决方案 1 仅适用于旧版本。

这就是我最终的结果:使用进程umask

解决方案 2 [更好]:

# mkdirs has mode 0777 by default, we get 0666 by masking out 0111
old_umask = os.umask(0111)

# create directory A/B/C
dir_name = os.path.dirname(file_path)

if not os.path.exists(dir_name):
    os.makedirs(dirp_name)

# save data to file (file mode is 0666 by default)
with open(file_path, 'w') as f:
    json.dump(data, f)

# restore old_umask
os.umask(old_umask)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多