Python pathlib Path().mkdir() 将所需模式应用到最终目录,但将 mode-umask 模式应用到父目录 - 错误?
Python pathlib Path().mkdir() applies desired mode to final directory, but mode-umask mode to parents - bug?
我正在使用 pathlib 设置文件夹结构,我希望将树中所有文件夹的权限设置为 drwxrwx--- (770)。
我当前的代码是:
p=Path('name/{}/{}/{}/category'.format(year,month,day))
pp=Path('name/{}/{}/{}'.format(year,month,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,parents=True,exist_ok=True)
os.system("chmod -R 770 {}".format(name))
有没有办法通过 Path().mkdir()
调用应用所需的权限,或者 os.system()
调用是不可避免的?
Path.mkdir
的 documentation 提到了这种行为:
If parents
is true, any missing parents of this path are created as needed; they are created with the default permissions without taking mode into account (mimicking the POSIX mkdir -p command).
避免这种情况的一种方法是自己迭代每个路径的 parts
或 parents
,用 exists_ok
调用 mkdir
但没有 parents
每个。这样,仍然会创建缺少的目录,但会考虑 mode
。这看起来像:
for parent in reversed(p.parents):
parent.mkdir(mode=0o770, exist_ok=True)
我正在使用 pathlib 设置文件夹结构,我希望将树中所有文件夹的权限设置为 drwxrwx--- (770)。
我当前的代码是:
p=Path('name/{}/{}/{}/category'.format(year,month,day))
pp=Path('name/{}/{}/{}'.format(year,month,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,parents=True,exist_ok=True)
os.system("chmod -R 770 {}".format(name))
有没有办法通过 Path().mkdir()
调用应用所需的权限,或者 os.system()
调用是不可避免的?
Path.mkdir
的 documentation 提到了这种行为:
If
parents
is true, any missing parents of this path are created as needed; they are created with the default permissions without taking mode into account (mimicking the POSIX mkdir -p command).
避免这种情况的一种方法是自己迭代每个路径的 parts
或 parents
,用 exists_ok
调用 mkdir
但没有 parents
每个。这样,仍然会创建缺少的目录,但会考虑 mode
。这看起来像:
for parent in reversed(p.parents):
parent.mkdir(mode=0o770, exist_ok=True)