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

Oz1*_*123 5 python linux permissions python-3.x

Python的文档是相当简洁,有关如何使用类似功能os.fchmod,os.chmod.我喜欢数字777和表达式之类的stat.S_IWRITE | stat.S_IEXEC.

什么是mode=0o777我在一些功能上看到的os模块?

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

Oz1*_*123 10

好.让我们从头开始.如果您了解Linux,chmod那么您已经是正确的理解之路.

在Python 2中,您可以简单地在Django项目中执行以下操作:

>>> os.chmod('manage.py', 0666)
Run Code Online (Sandbox Code Playgroud)

现在您将看到权限已更改:

git diff
diff --git a/manage.py b/manage.py
old mode 100755
new mode 100644
Run Code Online (Sandbox Code Playgroud)

你刚才看到的Python调用直接相当于在bash中执行:

chmod 0666 manage.py
Run Code Online (Sandbox Code Playgroud)

在以后的Python版本中,您可以使用os八进制数字的函数:

>>> os.chmod('manage.py', 0o666)
Run Code Online (Sandbox Code Playgroud)

这可能在开始时看起来很奇怪.但它只是pep3127中引入的新语法.因此,不是为Python提供0后跟八进制数字,而是使用Python 0o后跟八进制数字.

最后,stat模块具有数值常量,您可以对它们进行按位OR运算.它非常冗长,但我们来看看吧.

>>> stat.S_IRUSR  # this means user read permissions
256
Run Code Online (Sandbox Code Playgroud)

这看起来像一个整数.但实际上它被解释为二进制数os.chmod,所以你应该这样读:

>>> "{0:b}".format(stat.S_IRUSR)
'100000000'
>>>"{0:b}".format(stat.S_IWUSR)
'10000000'
Run Code Online (Sandbox Code Playgroud)

好吧,这很令人困惑,但len每个结果都要结账,前者要长一点

>>> len("{0:b}".format(stat.S_IWUSR))
8
>>> len("{0:b}".format(stat.S_IRUSR))
9
Run Code Online (Sandbox Code Playgroud)

我们可以结合这些stat常量来获得正确的所需文件模式:

>>> "{0:b}".format(stat.S_IRUSR|stat.S_IWUSR) # this is read and write for the user
'110000000'
Run Code Online (Sandbox Code Playgroud)

如果您想知道|这里不是基地的管道.这是按位OR.比特组合取两个正位并给出一个长度为9的结果,前两位设置为1.这意味着用户可以读取写入文件.

检查一下:

>>> "{0:b}".format(stat.S_IRUSR|stat.S_IWUSR|stat.S_IWGRP|stat.S_IRGRP)
'110110000'
Run Code Online (Sandbox Code Playgroud)

这开始看起来像chmodbash中的常见:

$ chmod 0660 manage.py
$ ls -l manage.py 
-rw-rw---- 1 oznt oznt 805 Mar 31 16:38 manage.py
Run Code Online (Sandbox Code Playgroud)

Bash表示不仅作为1或0的位,而且还表示它们的含义.所以左边第二位是用户的读权限,第三位是用户的写权限.下一组位是组权限,依此类推.

最后,您可以666在Python中将bash 模式与此结合使用:

os.chmod('manage.py', stat.S_IWGRP | stat.S_IRGRP | stat.S_IRUSR | stat.S_IWUSR | stat.S_IWOTH | stat.S_IROTH) 
Run Code Online (Sandbox Code Playgroud)

如果时间太长,请再次检查您可以这样做:os.chmod('manage.py', 0o666).