Python module os.chmod(file, 664) does not change the permission to rw-rw-r— but -w--wx----
最近我使用的是Python模块os,当我试图更改文件的权限时,我没有得到预期的结果。 例如,我打算将权限更改为rw-rw-r--,
1 | os.chmod("/tmp/test_file", 664) |
所有权许可实际上是-w - wx ---(230)
1 | --w--wx--- 1 ag ag 0 Mar 25 05:45 test_file |
但是,如果我在代码中将664更改为0664,结果就是我需要的结果,例如
1 | os.chmod("/tmp/test_file", 0664) |
结果是:
1 | -rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file |
任何人都可以帮助解释为什么领先的0对于获得正确的结果如此重要?
对于那些想要语义相似的人:
1 | $ chmod 755 somefile |
使用:
1 | $ python -c"import os; os.chmod('somefile', 0o755)" |
如果你的Python早于2.6:
1 | $ python -c"import os; os.chmod('somefile', 0755)" |
在另一个论坛上找到了这个
If you're wondering why that leading zero is important, it's because
permissions are set as an octal integer, and Python automagically
treats any integer with a leading zero as octal. So os.chmod("file",
484) (in decimal) would give the same result.
你正在做的是传递
在你的情况下,你需要
1 | os.chmod("/tmp/test_file", 436) |
[更新]注意,对于Python 3,你的前缀是0o(零哦)。 E.G,
前导"0"表示这是八进制常量,而不是十进制常量。你需要一个八进制来改变文件模式。
权限是一个位掩码,例如,rwxrwx ---是二进制的111111000,并且很容易将位分组3转换为八进制,而不是计算十进制表示。
0644(八进制)是二进制的0.110.100.100(为了便于阅读,我添加了点),或者,如您所计算,小数为420。
使用权限符号而不是数字
如果您使用了命名权限符号而不是原始幻数,例如,可以避免您的问题。对于
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/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中有记录,其名称与
另一个优点是文档中提到的更大的可移植性:
Note: Although Windows supports
chmod() , you can only set the file’s read-only flag with it (via thestat.S_IWRITE andstat.S_IREAD constants or a corresponding integer value). All other bits are ignored.
在Ubuntu 16.04,Python 3.5.2中测试。