Python模块os.chmod(file,664)不会改变对rw-rw-r--的权限,但是-w - wx
最近我使用的是Python模块os,当我试图更改文件的权限时,我没有得到预期的结果。 例如,我打算将权限更改为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对于获得正确的结果如此重要?
对于那些想要语义相似的人:
$ chmod 755 somefile
在python 2中:
$ python -c "import os; os.chmod('somefile', 0755)"
在python 3中:
$ python3 -c "import os; os.chmod('somefile', 0o755)"
在另一个论坛上找到了这个
如果你想知道为什么那个领先的零是重要的,那是因为 权限设置为八进制整数,Python自动设置 将前导零的任何整数视为八进制。 所以os.chmod(" file", 484)(十进制)会给出相同的结果。
你正在做的是通过0o666
,其中八进制是1230
在你的情况下,你需要
os.chmod("/tmp/test_file", 436)
[更新]注意,对于Python 3,你的前缀是0o(零哦)。 E.G,0o666
领先" 0" 意味着这是八进制常量,而不是十进制常量。 你需要一个八进制来改变文件模式。
权限是一个位掩码,例如,rwxrwx ---是二进制的111111000,并且很容易将位组3转换为八进制,而不是计算十进制表示。
0644(八进制)是二进制的0.110.100.100(为了便于阅读,我添加了点),或者,如您所计算,小数为420。
使用权限符号而不是数字
如果您使用了命名权限符号而不是原始幻数,例如,可以避免您的问题。 对于chmod +x
:
#!/usr/bin/env python3
import os
import stat
os.chmod(
'myfile',
stat.S_IRUSR |
stat.S_IWUSR |
stat.S_IRGRP |
stat.S_IWGRP |
stat.S_IROTH
)
这在[https://docs.python.org/3/library/os.html#os.chmod]中有记录,其名称与chmod +x
中记录的POSIX C API值相同。
另一个优点是文档中提到的更大的可移植性:
注意:尽管Windows支持
chmod +x
,但您只能使用它设置文件的只读标志(通过stat.S_IWRITE
和stat.S_IREAD
常量或相应的整数值)。 所有其他位都被忽略。
chmod +x
演示于:你如何做一个简单的" chmod + x" 从python内?
在Ubuntu 16.04,Python 3.5.2中测试。