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对于获得正确的结果如此重要?

AplusG asked 2019-08-20T10:15:05Z
4个解决方案
108 votes

对于那些想要语义相似的人:

$ chmod 755 somefile

在python 2中:

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

在python 3中:

$ python3 -c "import os; os.chmod('somefile', 0o755)"
Dima answered 2019-08-20T10:16:19Z
102 votes

在另一个论坛上找到了这个

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

你正在做的是通过0o666,其中八进制是1230

在你的情况下,你需要

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

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

RedBaron answered 2019-08-20T10:15:46Z
8 votes

领先" 0" 意味着这是八进制常量,而不是十进制常量。 你需要一个八进制来改变文件模式。

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

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

lenik answered 2019-08-20T10:16:59Z
0 votes

使用权限符号而不是数字

如果您使用了命名权限符号而不是原始幻数,例如,可以避免您的问题。 对于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_IWRITEstat.S_IREAD常量或相应的整数值)。 所有其他位都被忽略。

chmod +x演示于:你如何做一个简单的" chmod + x" 从python内?

在Ubuntu 16.04,Python 3.5.2中测试。

translate from https://stackoverflow.com:/questions/15607903/python-module-os-chmodfile-664-does-not-change-the-permission-to-rw-rw-r-bu