os.chmod()是跨平台设置文件只读权限最稳妥的方式,但windows仅映射stat.s_iwrite位(影响资源管理器“只读”勾选),linux/macos则真正移除所有用户写权限;需用0o444等八进制字面量,避免十进制或字符串误用。

Python中设置文件只读权限的可靠方式
Windows和Linux/macOS对“只读”的实现逻辑不同,os.chmod() 是跨平台最稳妥的选择,但要注意它不等于Windows资源管理器里的“只读属性勾选框”——后者实际影响的是文件的 stat.S_IWRITE 位。
- 在Linux/macOS上,
os.chmod(path, 0o444)会移除所有用户的写权限(包括owner),文件真正不可写 - 在Windows上,
os.chmod(path, 0o444)实际只清除 owner 的写位,表现为资源管理器中“只读”复选框被勾选;但用户仍可能通过其他程序绕过(如以管理员身份运行编辑器) - 别用
os.system("attrib +R")——它依赖cmd命令,路径含空格或中文时容易出错,且无法捕获失败状态 - 操作前建议先
os.stat(path)检查是否存在、是否有权限修改,避免静默失败
隐藏文件在不同系统下的真实含义
“隐藏”不是统一概念:Linux/macOS靠文件名前缀 .,Windows靠文件属性标记。Python无法用一个API同时生效,必须分平台处理。
- Linux/macOS:重命名即可,比如把
config.json改成.config.json,用os.rename()或pathlib.Path.rename() - Windows:调用
ctypes设置FILE_ATTRIBUTE_HIDDEN,os.chmod()完全无效 - 不要试图用
os.system("cmd /c attrib +H")——它不返回错误码,失败了你也看不到;而且如果用户禁用了cmd执行,直接卡住 - 隐藏 ≠ 安全:无论哪种方式,只要用户有读取权限,文件内容仍可被打开;敏感数据该加密还得加密
chmod参数中的八进制数到底怎么算
0o444、0o600 这些数字不是随便写的,每一位分别对应 owner/group/others 的读(4)、写(2)、执行(1)权限组合。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
0o600= owner 有读+写(4+2=6),group 和 others 权限为0 → 仅所有者可读写,适合私钥文件 -
0o400= owner 只读(4),其余无权限 → 更保守,防止误改 - 别写成
444(十进制)或"444"(字符串)——os.chmod()会静默失败或设错权限 - 想保留原权限再加/减某位?用位运算:
os.chmod(path, stat.S_IMODE(os.stat(path).st_mode) & ~stat.S_IWUSR)(去掉owner写权限)
为什么不能依赖shutil.copy()自动继承权限
shutil.copy() 默认只复制内容,不复制权限;shutil.copy2() 才会尝试保留 atime/mtime 和权限,但它在Windows下对“只读”属性的支持不稳定,尤其NTFS压缩或加密文件上常失效。
- 复制后立刻调用
os.chmod(dst, 0o400)是唯一可控的做法 - 如果源文件本身是符号链接,
copy2()可能复制链接本身而非目标,导致权限设置错对象 - 虚拟环境或容器里运行时,挂载卷的umask可能覆盖你设的权限,建议复制后再次
os.stat()校验
权限设置不是一劳永逸的事——文件被其他进程(比如IDE自动保存、备份工具同步)修改后,只读状态可能丢失;关键敏感文件最好在每次读取前检查 os.stat().st_mode,发现可写就立刻重置。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










