Python模块os.chmod(file,664)不会改变对rw-rw-r-但-w-wx的权限—-

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.

你正在做的是传递664,其中八进制是1230

在你的情况下,你需要

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

[更新]注意,对于Python 3,你的前缀是0o(零哦)。 E.G,0o666


前导"0"表示这是八进制常量,而不是十进制常量。你需要一个八进制来改变文件模式。

权限是一个位掩码,例如,rwxrwx ---是二进制的111111000,并且很容易将位分组3转换为八进制,而不是计算十进制表示。

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


使用权限符号而不是数字

如果您使用了命名权限符号而不是原始幻数,例如,可以避免您的问题。对于664

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中有记录,其名称与man 2 stat中记录的POSIX C API值相同。

另一个优点是文档中提到的更大的可移植性:

Note: Although Windows supports chmod(), you can only set the file’s read-only flag with it (via the stat.S_IWRITE and stat.S_IREAD constants or a corresponding integer value). All other bits are ignored.

chmod +x演示于:如何在python中执行简单的"chmod + x"?

在Ubuntu 16.04,Python 3.5.2中测试。