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

时间:2013-03-25 04:54:34

标签: python file permissions chmod

最近我使用的是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对于获得正确的结果非常重要吗?

7 个答案:

答案 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)

different forum

上找到此信息
  

如果你想知道为什么领先零是重要的,那是因为   权限设置为八进制整数,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_IWRITEstat.S_IREAD常量或相应的整数值)。其他所有位都将被忽略。

在以下位置展示了

chmod +xHow 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))