Python模块os.chmod(文件,664)不会将权限更改为rw-rw-r-但是-w – wx —-

最近我使用Python模块操作系统,当我试图改变一个文件的权限,我没有得到预期的结果。 例如,我打算将权限更改为rw-rw-r–,

os.chmod("/tmp/test_file", 664) 

所有权许可实际上是-w – wx —(230)

 --w--wx--- 1 ag ag 0 Mar 25 05:45 test_file 

但是,如果我在代码中将664更改为0664,则结果就是我所需要的,例如

 os.chmod("/tmp/test_file", 0664) 

结果是:

 -rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file 

有人可以帮助解释为什么这个领先的0对于得到正确的结果是如此重要吗?

在另一个论坛上find这个

如果你想知道为什么这个前导零是重要的,那是因为权限被设置为一个八进制整数,Python自动将任何具有前导零的整数视为八进制。 所以os.chmod(“file”,484)(十进制)会给出相同的结果。

你正在做的是通过664八进制是1230

在你的情况下,你会需要

 os.chmod("/tmp/test_file", 436) 

[更新]请注意,对于Python 3,您的前缀为0(零哦)。 EG, 0o666

所以对于那些想要类似于symantics的人来说:

 $ chmod 755 somefile 

在python2中:

 $ python -c "import os; os.chmod('somefile', 0755)" 

但在python3中:

 $ python3 -c "import os; os.chmod('somefile', 0o755)" 

领先的“0”意味着这是八进制常数,而不是小数。 你需要一个八进制来改变文件模式。

权限是一个位掩码,例如,rwxrwx —是二进制的111111000,并且很容易将3个位组合成8进制数,而不是计算十进制表示。

0644(八进制)是二进制的0.110.100.100(为了便于阅读,我添加了小点),或者如你所计算的,十进制是420。