好的。让我们从头开始。如果你了解linuxchmod
你已经是明白的正轨了。
在 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。所以不要给Python喂食0
后跟一个八进制数,您可以向 Python 提供0o
后面跟着一个八进制数。
最后,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'
如果你想知道|
这里不是像基地那样的管道。这是按位或。按位组合采用两个正位,并给出长度为 9 的结果,前两位设置为 1。这意味着用户可以读取和写入文件。
检查一下:
>>> "{0:b}".format(stat.S_IRUSR|stat.S_IWUSR|stat.S_IWGRP|stat.S_IRGRP)
'110110000'
这开始看起来像平常一样chmod
在bash中:
$ 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位是用户的写权限。下一组位是组权限等等。
最后,你可以组合模式666
在 bash 中到 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)
.