如何在Python3中设置文件权限?
问题内容:
Python的文档是相当简洁,有关如何使用类似功能os.fchmod
,os.chmod
。我对数字777
和这样的表达感到困惑stat.S_IWRITE | stat.S_IEXEC
。
什么是mode=0o777
我在一些功能上看到的os
模块?
你能解释一下这是什么吗?
问题答案:
好。让我们从头开始。如果您知道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
,您可以在Python0o
后面加上一个八进制数,而不是在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'
如果您想知道|
这里的管道不是底部。这是按位OR。按位组合使用两个正数位,结果为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)
。