最近我使用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领先是非常重要的,以获得正确的结果呢?
发现这个在不同的论坛
如果你想知道为什么前导零是很重要的,这是因为权限被设置为一个八进制整数,和Python自动地把与八进制前导零的任意整数。 所以os.chmod(“文件”,484)(十进制)将给出相同的结果。
你在做什么是经过664
这八进制为1230
在你的情况,你需要
os.chmod("/tmp/test_file", 436)
[更新]注意,为Python 3你有0O前缀(零哦)。 EG, 0o666
所以,谁想要类似的语义的人:
$ chmod 755 somefile
在Python 2:
$ python -c "import os; os.chmod('somefile', 0755)"
在Python 3:
$ python3 -c "import os; os.chmod('somefile', 0o755)"
领先的“0”表示,这是八进制常数,而不是一个小数。 你需要一个八进制更改文件模式。
权限是位掩码,例如,rwxrwx ---是二进制111111000,它由3很容易组的比特转换为八进制,比计算十进制表示。
0644(八进制)是二进制0.110.100.100(我增加了可读性点),或者,你可能在十进制计算,420。
使用许可符号来代替数字
将被避免你的问题,如果您曾使用指定的权限符号而不是原始幻数,例如,用于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_IWRITE
和stat.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----