为何os.chmod在Debian系统抛出NotImplementedError异常?
问题解析:os.chmod follow_symlinks参数在Debian 11中报错但os.supports_follow_symlinks正常的原因
核心原因
os.supports_follow_symlinks的检查范围不针对单个函数
这个属性是一个集合,用于标记整个os模块是否存在支持follow_symlinks参数的函数(比如os.stat、os.lstat,或部分平台的os.chmod),而非某个具体函数(如os.chmod)是否实现了该参数。Debian 11的Python 3.9中,os.lchmod等函数支持符号链接操作,所以os.supports_follow_symlinks会返回包含对应标记的集合,不会抛出异常,但这并不代表os.chmod本身支持follow_symlinks参数。Python版本与平台的实现差异
- macOS的Python 3.10.8中,
os.chmod的follow_symlinks参数已被实现,底层会根据参数选择调用chmod或lchmod系统调用。 - Debian 11的Python 3.9.2中,
os.chmod并未实现follow_symlinks参数——Linux系统下传统的设计是用单独的os.lchmod函数来修改符号链接本身的权限,而非通过os.chmod的参数控制。直到Python 3.10,os.chmod的follow_symlinks参数才被扩展到Linux平台支持。
- macOS的Python 3.10.8中,
解决方案
在Linux的Python 3.9环境中,若要修改符号链接本身的权限,直接使用os.lchmod即可:
os.lchmod('/foo/bar.txt', 0o644)
如果需要跨平台兼容,可以通过版本或平台判断来实现:
import os import sys path = '/foo/bar.txt' mode = 0o644 if sys.version_info >= (3, 10): os.chmod(path, mode, follow_symlinks=False) elif sys.platform == 'linux': os.lchmod(path, mode) else: # 处理其他旧平台逻辑 os.chmod(path, mode)
内容的提问来源于stack exchange,提问作者Carl Winbäck
相关产品推荐
相关产品推荐

