关于Python中Pathlib.Path.mkdir方法mode=511转换为目录权限775的原理咨询
理解Pathlib.Path.mkdir()中mode=511到权限775的转换逻辑
先理清几个核心前提,就能搞懂这个转换了:
- Unix/Linux的文件权限本质是9位二进制位(分成用户、组、其他三类,每类3位:读
r=4、写w=2、执行x=1),通常用八进制数表示(每3位二进制对应1位八进制)。 Path.mkdir()的mode参数接受十进制数,但最终会被解析为八进制权限位;你也可以直接传八进制数(比如mode=0o777,和mode=511完全等价,因为十进制511=八进制0o777)。- 实际生效的权限不是直接用你指定的
mode,而是会和当前进程的umask做运算:实际权限 = 指定的mode & (~umask)(~是按位取反,只取低9位权限位)。
第一步:把mode=511转成八进制权限
十进制511转换成八进制是0o777,对应二进制是111 111 111——也就是用户、组、其他都拥有读、写、执行权限,这是最开放的目录权限。
第二步:结合你的umask=0002计算实际权限
你的umask是0002,转成八进制是0o002,二进制是000 000 010。
对0o002按位取反(只看低9位)得到0o775(二进制111 111 101)。
然后做按位与运算:
0o777 & 0o775 = 0o775
0o775对应的权限字符串就是drwxrwxr-x,和你用ls -dal看到的结果完全一致。
验证你的其他测试案例
用同样的逻辑可以解释你测试的其他mode值:
- 当
mode=611时:十进制611转八进制是0o1143(二进制1 001 100 011)。和~0o002=0o775做按位与得到0o1141——其中0o1000是粘滞位(对应权限字符串的t),0o0100是组的读权限(r--),0o0001是用户和其他的执行权限(--x),最终权限字符串就是d--xr----t,和你的测试结果一致。 - 当
mode=411时:十进制411转八进制是0o633(二进制110 011 011)。和~0o002=0o775做按位与得到0o631,对应权限字符串drw--wx--x,和你看到的结果匹配。 - 当
mode=311时:十进制311转八进制是0o467(二进制100 110 111)。和~0o002=0o775做按位与得到0o465,对应权限字符串dr--rw-r-x,和你的测试结果一致。
小提示
以后在Python中设置权限时,建议直接用八进制数(比如mode=0o777),比十进制数更直观,不容易混淆。
内容的提问来源于stack exchange,提问作者mon
相关产品推荐
相关产品推荐

