【问题标题】:How to set file permissions in Python3?如何在 Python3 中设置文件权限?
【发布时间】:2026-02-10 11:10:01
【问题描述】:

Python 自己的文档非常简洁地介绍了如何使用 os.fchmodos.chmod 等函数。我对777 之类的数字和stat.S_IWRITE | stat.S_IEXEC 之类的表达式感到困惑。

我在os模块的一些函数中看到了什么mode=0o777

你能解释一下这是什么吗?

【问题讨论】:

    标签: python linux python-3.x permissions


    【解决方案1】:

    好的。让我们从头开始。如果你知道 linux chmod 你已经是正确的理解了。

    在 Python 2 中,您可以简单地在 Django 项目中执行以下操作:

    >>> os.chmod('manage.py', 0666)
    

    现在您将看到权限已更改:

    git diff
    diff --git a/manage.py b/manage.py
    old mode 100755
    new mode 100644
    

    您刚才看到的 Python 调用与在 bash 中的直接等效:

    chmod 0666 manage.py
    

    在以后的 Python 版本中,您可以使用带有八进制数的 os 函数:

    >>> os.chmod('manage.py', 0o666)
    

    一开始这可能看起来很奇怪。但这只是pep3127 中引入的新语法。因此,不要用 0 后跟八进制数来输入 Python,而是用 0o 后跟八进制数来输入 Python。

    最后,stat 模块具有数字常量,您可以将它们与它们的按位或运算结合起来。很啰嗦,不过还是看一下吧。

    >>> stat.S_IRUSR  # this means user read permissions
    256
    

    看起来像一个整数。但实际上被os.chmod解释为二进制数,所以你应该这样读:

    >>> "{0:b}".format(stat.S_IRUSR)
    '100000000'
    >>>"{0:b}".format(stat.S_IWUSR)
    '10000000'
    

    好的,这很令人困惑,但是在每个结果上检查 len,前者要长 1 位

    >>> len("{0:b}".format(stat.S_IWUSR))
    8
    >>> len("{0:b}".format(stat.S_IRUSR))
    9
    

    我们可以结合这些stat 常量来获得合适的所需文件模式:

    >>> "{0:b}".format(stat.S_IRUSR|stat.S_IWUSR) # this is read and write for the user
    '110000000'
    

    如果您想知道 | 这里不是像 base 中的管道。这是bitwise OR。逐位组合获取两个正位并给我们一个长度为 9 的结果,前两位设置为 1。这意味着用户可以读取和写入文件。

    检查一下:

    >>> "{0:b}".format(stat.S_IRUSR|stat.S_IWUSR|stat.S_IWGRP|stat.S_IRGRP)
    '110110000'
    

    这开始看起来像 bash 中通常的 chmod

    $ chmod 0660 manage.py
    $ ls -l manage.py 
    -rw-rw---- 1 oznt oznt 805 Mar 31 16:38 manage.py
    

    Bash 不仅将位表示为 1 或 0,还表示其含义。所以左起第2位是用户的读权限,第3位是用户的写权限。下一组位是组权限等等。

    最后,你可以将bash中的666模式与Python中的这个结合起来:

    os.chmod('manage.py', stat.S_IWGRP | stat.S_IRGRP | stat.S_IRUSR | stat.S_IWUSR | stat.S_IWOTH | stat.S_IROTH) 
    

    如果太长,请再次检查您是否可以这样做:os.chmod('manage.py', 0o666)

    【讨论】: