设置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
相关产品推荐
相关产品推荐

