os.chmod() 对文件夹无效且报 PermissionError 是因系统权限模型差异:Windows 仅控制只读属性,UAC 会拦截受保护路径;Linux/macOS 需目录有写+执行位(wx)才能遍历和写入,父目录缺 x 也会失败。
![如何修复python中的permissionerror: [errno 13] permission denied_更改文件夹写入权限](https://img.php.cn/upload/article/000/969/633/177829101734576.png)
为什么 os.chmod() 对文件夹没用,但还是报 PermissionError?
因为 Windows 和 Linux/macOS 的权限模型完全不同。在 Windows 上,os.chmod() 仅影响“只读”属性(即 stat.S_IWRITE),它不控制用户能否创建/删除子项;而在 Linux/macOS 中,真正决定“能否往文件夹里写”是该目录的“执行位”(x)——没有 x,连 ls 都进不去,更别说 open(..., 'w') 或 os.mkdir()。
所以你调用 os.chmod(path, 0o755) 后仍报 [Errno 13] Permission denied,大概率是因为:
- 目标路径在 Windows 上属于受保护位置(如
C:\Program Files、C:\Windows),即使设了写权限,UAC 也会拦截 - 路径在 Linux/macOS 上所属用户不是当前运行 Python 的用户,且组/其他无写权限(
drwxr-xr-x→ 缺少w) - 父目录缺少执行权限(Linux/macOS),导致无法遍历到该路径
Linux/macOS 下真正有效的修复方式
用 chmod 命令或 os.chmod() 设置目录权限时,必须确保:当前用户是所有者,或属于有写权限的组,且目录本身有 wx(写+执行)权限。执行位不可省略——否则 OSError: Permission denied 仍会出现。
实操建议:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 先查归属:
ls -ld /path/to/dir,确认输出中第一列含drwx(不是dr-x),第三列是你的用户名 - 加写+执行权限:
chmod u+wx /path/to/dir(仅对自己生效)或chmod 755 /path/to/dir(需谨慎) - 若属主不对,用
sudo chown $USER:$USER /path/to/dir改归属(别对系统目录乱用) - Python 中等价操作:
os.chmod('/path/to/dir', 0o755)—— 注意必须是八进制字面量(0o755,不是755)
Windows 下绕过 UAC 限制的实用办法
Windows 不靠传统 Unix 权限,而依赖 ACL 和 UAC。直接改 os.chmod() 几乎无效,尤其当路径在 Program Files 或 Windows 下时,任何写操作都会被拦截,哪怕你是管理员。
能落地的方案只有两个:
- 把数据目录移到用户空间,例如
Path.home() / 'AppData' / 'Local' / 'MyApp'(推荐) - 以管理员身份运行整个 Python 进程(不推荐用于日常脚本,且需 manifest 或右键“以管理员身份运行”)
- 用
ctypes调用SetFileAttributesW清除只读属性(仅对文件有效,对文件夹无效)
示例(安全迁移路径):
from pathlib import Path<br>data_dir = Path.home() / 'AppData' / 'Local' / 'myapp'<br>data_dir.mkdir(parents=True, exist_ok=True)<br># 后续所有 open()/os.mkdir() 都走这个路径
检查权限是否真的生效的最小验证法
别只信 ls -l 或属性对话框,要实际触发一次写操作并捕获异常:
- Linux/macOS:
python3 -c "import tempfile; tempfile.mkdtemp(dir='/path/to/dir')"—— 成功说明可写 - Windows:
python -c "open(r'C:\path\to\dir\test.tmp', 'w').close(); import os; os.unlink(r'C:\path\to\dir\test.tmp')" - Python 代码中加兜底:
try:<br> with open(Path(my_dir) / 'test_write', 'w') as f:<br> f.write('ok')<br> (Path(my_dir) / 'test_write').unlink()<br>except PermissionError:<br> print('Still no write access')
真实环境中,最常被忽略的是父目录权限(比如 /a/b/c 可写,但 /a/b 没 x 权限,就进不去 c)和 Windows 的 UAC 隐式拦截——这两处不排查,光改目标目录权限永远无效。

















