如何在Python3中设置文件权限?

时间:2017-06-28 06:17:43

标签: python linux python-3.x permissions

Python自己的文档非常简洁,关于如何使用os.fchmodos.chmod等函数。我对777等数字和stat.S_IWRITE | stat.S_IEXEC等表达式感到困惑。

我在mode=0o777模块中的某些函数中看到的os是什么?

你能解释一下这是什么吗?

1 个答案:

答案 0 :(得分:8)

行。让我们从头开始。如果你知道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模块具有数值常量,您可以对它们进行按位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'

如果你想知道|这里不是基地的管道。这是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)