Python自己的文档对于如何使用os.fchmod
、os.chmod
等函数非常简略。我对像777
和stat.S_IWRITE | stat.S_IEXEC
这样的数字和表达式感到困惑。
还有,我在os
模块的一些函数中看到了mode=0o777
,这是什么?
能否请您解释一下这是什么意思?
Python自己的文档对于如何使用os.fchmod
、os.chmod
等函数非常简略。我对像777
和stat.S_IWRITE | stat.S_IEXEC
这样的数字和表达式感到困惑。
还有,我在os
模块的一些函数中看到了mode=0o777
,这是什么?
能否请您解释一下这是什么意思?
好的。让我们从头开始。如果你知道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中引入的新语法。所以现在你可以用0o
后跟一个八进制数来代替以前用0
接着八进制数的方式来输入给Python。
最后,stat
模块有一些数字常量,你可以将它们与按位 OR 操作相结合。虽然很冗长,但咱们还是来看看吧。
>>> 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'
如果你有疑问,这里的|
不是像基础中的管道符号一样。 这是按位或。 按位组合取了两个正位并给我们一个长度为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位表示用户的写入权限。接下来的一组位是组权限等等。
最后,在Python中将bash模式666
与此结合即可:
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)
。