Python模块os.chmod(文件,664)不改变权限RW-RW-R-但-w - WX --

2019-07-23 03:50发布

最近我使用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领先是非常重要的,以获得正确的结果呢?

Answer 1:

发现这个在不同的论坛

如果你想知道为什么前导零是很重要的,这是因为权限被设置为一个八进制整数,和Python自动地把与八进制前导零的任意整数。 所以os.chmod(“文件”,484)(十进制)将给出相同的结果。

你在做什么是经过664这八进制为1230

在你的情况,你需要

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

[更新]注意,为Python 3你有0O前缀(零哦)。 EG, 0o666



Answer 2:

所以,谁想要类似的语义的人:

$ chmod 755 somefile

在Python 2:

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

在Python 3:

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


Answer 3:

领先的“0”表示,这是八进制常数,而不是一个小数。 你需要一个八进制更改文件模式。

权限是位掩码,例如,rwxrwx ---是二进制111111000,它由3很容易组的比特转换为八进制,比计算十进制表示。

0644(八进制)是二进制0.110.100.100(我增加了可读性点),或者,你可能在十进制计算,420。



Answer 4:

使用许可符号来代替数字

将被避免你的问题,如果您曾使用指定的权限符号而不是原始幻数,例如,用于664

#!/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和名称是一样的POSIX C API的文档值man 2 stat

另一个优点是在文档中提到的更大的便携性:

注意:尽管Windows支持chmod()你只能设置文件与它只读标志(通过stat.S_IWRITEstat.S_IREAD常量或相应的整数值)。 所有其他位被忽略。

chmod +x证明在: 如何从蟒蛇内做一个简单的“使用chmod + x”的?

经测试在Ubuntu 16.04,Python的3.5.2。



文章来源: Python module os.chmod(file, 664) does not change the permission to rw-rw-r— but -w--wx----