【发布时间】:2026-02-10 11:10:01
【问题描述】:
Python 自己的文档非常简洁地介绍了如何使用 os.fchmod、os.chmod 等函数。我对777 之类的数字和stat.S_IWRITE | stat.S_IEXEC 之类的表达式感到困惑。
我在os模块的一些函数中看到了什么mode=0o777?
你能解释一下这是什么吗?
【问题讨论】:
标签: python linux python-3.x permissions
Python 自己的文档非常简洁地介绍了如何使用 os.fchmod、os.chmod 等函数。我对777 之类的数字和stat.S_IWRITE | stat.S_IEXEC 之类的表达式感到困惑。
我在os模块的一些函数中看到了什么mode=0o777?
你能解释一下这是什么吗?
【问题讨论】:
标签: python linux python-3.x permissions
好的。让我们从头开始。如果你知道 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)。
【讨论】: