Python3通过chmod修改目录或文件权限的方法示例
本文介绍Python3中修改文件或目录权限的两种主要方式:通过os.chmod方法直接设置权限值,以及利用stat模块提供的常量简化操作。针对递归修改目录权限的需求,推荐使用subprocess模块调用系统chmod命令。文章包含具体代码示例及权限常量说明,帮助开发者快速掌握权限管理技巧。
简要介绍Linux系统中的文件权限机制。
在Linux系统中,文件权限被划分为“所有者”、“组用户”和“其他用户”三个角色。每个角色由3个二进制位(bit)表示其权限,这3个位从左至右分别对应读(Read)、写(Write)和执行(Execute)权限。3位二进制数的取值范围为0到7。因此,在Linux命令行中执行“chmod 777 xxx.sh”,意味着将xxx.sh文件的读、写、执行权限同时赋予所有者、组用户以及其他所有用户。
使用os模块的chmod函数。
Python的os模块负责处理操作系统层面的交互操作。要修改文件权限,可以使用os模块提供的chmod方法。其基本语法为:os.chmod(path, mode)。其中,path参数指定需要修改权限的文件或目录路径;mode参数为权限值,即文件9位权限对应的十进制数值,取值范围是0到511。
例如,若要将xxx.sh文件设置为仅所有者拥有读权限,其他角色无任何权限,在Linux中使用“ls -l”命令查看的结果为“-r---------”。这里的第一个“-”代表文件类型,随后的9位代表具体权限,对应的二进制值为100000000。此时,mode参数的取值应为256。因此,对应的Python修改权限代码为:os.chmod("xxx.sh", 256)。
这种手动计算十进制值的方式是否过于繁琐?
幸运的是,Python的stat模块提供了预定义的常量,可以直接对应使用,无需手动计算。
| 常量 | 描述 |
|---|---|
| S_IRWXU | 所有者读写执行权限,代表值:448 |
| S_IRUSR | 所有者读,代表值:256 |
| S_IWUSR | 所有者写,代表值:128 |
| S_IXUSR | 所有者执行,代表值:64 |
| S_IRWXG | 用户组读写执行权限,代表值:56 |
| S_IRGRP | 用户组读,代表值:32 |
| S_IWGRP | 用户组写,代表值:16 |
| S_IXGRP | 用户组执行,代表值:8 |
| S_IRWXO | 其他用户读写执行,代表值:7 |
| S_IROTH | 其他用户读,代表值:4 |
| S_IWOTH | 其他用户写,代表值:2 |
| S_IXOTH | 其他用户执行,代表值:1 |
以下代码展示了如何将xxx.sh文件设置为:所有者拥有读写执行权限,用户组拥有读和执行权限,其他用户仅拥有读权限。对应的Linux权限字符串为“-rwxr-xr--”:
import os
import stat
os.chmod("xxx.sh", stat.S_IRWXU+stat.S_IRGRP+stat.S_IXGRP+stat.S_IROTH)
如果觉得这些常量难以记忆,或者使用不够便捷怎么办?
可以编写一个类似Linux“chmod 777”命令使用方式的工具函数(util)。
import re
import os
import stat
RD, WD, XD = 4, 2, 1
BNS = [RD, WD, XD]
MDS = [
[stat.S_IRUSR, stat.S_IRGRP, stat.S_IROTH],
[stat.S_IWUSR, stat.S_IWGRP, stat.S_IWOTH],
[stat.S_IXUSR, stat.S_IXGRP, stat.S_IXOTH]
]
def chmod(path, mode):
if isinstance(mode, int):
mode = str(mode)
if not re.match("^[0-7]{1,3}$", mode):
raise Exception("mode does not conform to ^[0-7]{1,3}$ pattern")
mode = "{0:0>3}".format(mode)
mode_num = 0
for midx, m in enumerate(mode):
for bnidx, bn in enumerate(BNS):
if (int(m) & bn) > 0:
mode_num += MDS[bnidx][midx]
os.chmod(path, mode_num)
if __name__ == '__main__':
chmod("xxx.sh", "744") #744代表所有者读写执行,组和其他的权限只有读
类似地,你也可以扩展该工具函数,使其支持类似“chmod u+rwx,g+rw,o+rw xxx.sh”这种更细致的权限指定方式。
注意:os.chmod方法似乎不支持递归修改目录下所有文件的权限。如果需要递归修改,可以使用subprocess模块直接调用系统命令。
通过subprocess模块直接调用chmod命令。
subprocess模块用于运行子进程。它允许在子进程中调用操作系统命令或执行Shell脚本,并获取标准输出(stdout)和标准错误(stderr)。
import subprocess
if __name__ == '__main__':
cmd = ['chmod', "-R", "777", "xxx.sh"]
res = subprocess.run(cmd, universal_newlines=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
print(res.returncode, res.stdout, res.stderr)
至此,关于Python3通过chmod修改目录或文件权限的方法示例介绍完毕。更多相关Python3 chmod修改目录或文件权限内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









