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

9

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

还有,我在os模块的一些函数中看到了mode=0o777,这是什么?

能否请您解释一下这是什么意思?

1个回答

19

好的。让我们从头开始。如果你知道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中引入的新语法。所以现在你可以用0o后跟一个八进制数来代替以前用0接着八进制数的方式来输入给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'

如果你有疑问,这里的|不是像基础中的管道符号一样。 这是按位或。 按位组合取了两个正位并给我们一个长度为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,还包含它们所代表的含义。从左数第2位表示用户的读取权限,第3位表示用户的写入权限。接下来的一组位是组权限等等。

最后,在Python中将bash模式666与此结合即可:

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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接