最近我使用的是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对于获得正确的结果非常重要吗?
答案 0 :(得分:109)
对于那些想要语义类似于:
的人$ chmod 755 somefile
在python 2中:
$ python -c "import os; os.chmod('somefile', 0755)"
在python 3中:
$ python3 -c "import os; os.chmod('somefile', 0o755)"
答案 1 :(得分:103)
如果你想知道为什么领先零是重要的,那是因为 权限设置为八进制整数,Python自动设置 将前导零的任何整数视为八进制。所以os.chmod(“文件”, 484)(十进制)会给出相同的结果。
您正在做的是传递664
八进制为1230
在您的情况下,您需要
os.chmod("/tmp/test_file", 436)
[更新]注意,对于Python 3,您的前缀为0o(零哦)。 E.G,0o666
答案 2 :(得分:8)
前导“0”表示这是八进制常量,而不是十进制常量。你需要一个八进制来改变文件模式。
权限是一个位掩码,例如,rwxrwx ---是二进制的111111000,并且很容易将位分组3转换为八进制,而不是计算十进制表示。
0644(八进制)是二进制的0.110.100.100(为了便于阅读,我添加了点),或者,如您所计算,小数为420.
答案 3 :(得分:3)
如果您希望将权限保存到字符串,请这样做
s = '660'
os.chmod(file_path, int(s, base=8))
答案 4 :(得分:1)
使用权限符号代替数字
如果您使用命名的权限符号而不是原始的魔术数字(例如,为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,名称与man 2 stat
中记录的POSIX C API值相同。
另一个优势是文档中提到的更大的可移植性:
在以下位置展示了注意:尽管Windows支持
chmod()
,但您只能使用它设置文件的只读标志(通过stat.S_IWRITE
和stat.S_IREAD
常量或相应的整数值)。其他所有位都将被忽略。
chmod +x
:How do you do a simple "chmod +x" from within python?
在Ubuntu 16.04,Python 3.5.2中进行了测试。
答案 5 :(得分:0)
在我看来,使用stat。*位掩码似乎是最可移植,最明确的方法。但另一方面,我经常忘记如何最好地处理该问题。因此,这是一个掩盖“组”和“其他”权限并保持“所有者”权限不变的示例。使用位掩码和减法是一种有用的模式。
import os
import stat
def chmodme(pn):
"""Removes 'group' and 'other' perms. Doesn't touch 'owner' perms."""
mode = os.stat(pn).st_mode
mode -= (mode & (stat.S_IRWXG | stat.S_IRWXO))
os.chmod(pn, mode)
答案 6 :(得分:0)
@mc.dev 的答案是这里最好的答案,我最终利用它来制作下面的函数包装器以供重用。感谢分享。
def chmod_digit(file_path, perms):
"""
Helper function to chmod like you would in unix without having to preface 0o or converting to octal yourself.
Credits: https://stackoverflow.com/a/60052847/1621381
"""
os.chmod(file_path, int(str(perms), base=8))