微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python pathlib Path().mkdir() 将所需模式应用于最终目录,但将 mode-umask 模式应用于父目录 - 错误?

如何解决Python pathlib Path().mkdir() 将所需模式应用于最终目录,但将 mode-umask 模式应用于父目录 - 错误?

我正在使用 pathlib 来设置文件夹结构,为此我希望将树中所有文件夹的权限设置为 drwxrwx--- (770)。

我当前的代码是:

p=Path('name/{}/{}/{}/category'.format(year,month,day))
pp=Path('name/{}/{}/{}'.format(year,day))
p.mkdir(mode=0o770,parents=True,exist_ok=True)

我需要 exist_ok=True,因为我希望在循环遍历 category 值时使用同一行。但是,在测试时我正在删除文件夹。

运行后,

oct(p.stat().st_mode)
0o40770
oct(pp.stat().st_mode)
0o40775

即,父目录的认权限为 777(umask=002)。

我能想到的唯一解决方法是:

p.mkdir(mode=0o770,exist_ok=True)
os.system("chmod -R 770 {}".format(name))

有没有办法通过 Path().mkdir() 调用应用所需的权限,或者 os.system() 调用是否不可避免?

解决方法

Path.mkdirdocumentation 提到了这种行为:

如果 parents 为真,则根据需要创建此路径的任何缺失父项;它们是使用默认权限创建的,不考虑模式(模仿 POSIX mkdir -p 命令)。

避免这种情况的一种方法是自己迭代每个路径的 partsparents,使用 mkdir 调用 exists_ok 但每个都没有 parents。这样,仍然会创建丢失的目录,但会考虑 mode。这看起来像:

for parent in reversed(p.parents):
    parent.mkdir(mode=0o770,exist_ok=True)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。