好的。让我们从头开始。如果您了解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中引入的新语法。所以,不要给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,前者要长一点>>> 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'
如果你想知道|这里不是一个管道作为基础。这是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,还表示它们的含义。所以左边的第二位是用户的读权限,第三位是用户的写权限。下一组位是组权限等等。
最后,您可以将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)。