You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置umask(0)调用os.makedirs后仍无法创建文件:权限拒绝问题

问题分析与解决

首先,你遇到的核心问题有两个:

  • 打印的st_mode包含文件类型标识,导致你误判了目录的实际权限
  • os.makedirs的exist_ok=True参数会阻止修改已存在目录的权限

1. 正确解读目录权限

os.stat(BASEDIR).st_mode返回的是完整的文件模式位,其中高几位是文件类型(比如0x4000/0o40000代表目录),实际权限位需要取后三位八进制,也就是用os.stat(BASEDIR).st_mode & 0o777来计算。你的输出0x4177转换后,权限部分是0o567(对应十进制375),这意味着目录的属主只有读和执行权限,没有写入权限——这就是你无法创建文件的直接原因(创建文件需要目录有写入权限)。

2. 为何设置umask(0)和mode=0o777无效?

因为你用了exist_ok=True:如果目标目录./cdm已经存在,os.makedirs不会修改它的权限,哪怕你指定了mode=0o777。只有当目录是新建的时候,mode参数才会生效(结合umask计算实际权限)。

3. 解决方法

修改代码,在创建目录后(无论是否新建)手动设置目录权限:

BASEDIR="./cdm"
import os
from pathlib import Path

try:
    original_umask = os.umask(0)
    print("original_umask", original_umask)
    os.makedirs(BASEDIR, mode=0o777, exist_ok=True)
    # 强制修改目录权限,确保属主有写入权限
    os.chmod(BASEDIR, 0o777)
    # 正确打印实际权限
    print('perms on dir', oct(os.stat(BASEDIR).st_mode & 0o777))
    print("files: ",[f.name for f in Path(BASEDIR).glob("*")])
finally:
    os.umask(original_umask)

with open(f"{BASEDIR}/xx.yml",'w') as f:
    f.write("hi")

额外说明

  • macOS Ventura的系统权限控制(比如隐私设置)一般不会影响本地目录的读写,但如果目录在受保护的路径下(比如/Applications),可能需要特殊处理,但你的情况是当前目录下的cdm,大概率是权限继承的问题。
  • 恢复umask的操作是正确的,避免影响后续代码的权限计算,但它不影响本次目录权限的设置(因为我们已经用chmod强制修改了)。

内容的提问来源于stack exchange,提问作者WestCoastProjects

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:22:39