Python中如何测试目录权限?

8
在Windows上的Python中,有没有一种方法可以确定用户是否有权限访问目录?我已经查看了os.access,但它会给出错误的结果。
>>> os.access('C:\haveaccess', os.R_OK)
False
>>> os.access(r'C:\haveaccess', os.R_OK)
True
>>> os.access('C:\donthaveaccess', os.R_OK)
False
>>> os.access(r'C:\donthaveaccess', os.R_OK)
True

我做错了什么吗?有更好的方法来检查用户是否具有访问目录的权限吗?


1
第一次和第三次访问失败是因为 \h 被解释为(无效的)转义序列。 - Adam Rosenfield
4个回答

7
在Windows中检查权限可能会很复杂(例如,在Vista中使用UAC时要注意问题!请参见此相关问题)。
您是否在谈论简单的读取访问权限,例如读取目录内容? 测试权限的最可靠方法是尝试访问目录(例如进行os.listdir),并捕获异常。
此外,为了正确解释路径,您必须使用原始字符串或转义反斜杠('\\'),或者改用正斜杠。
(编辑:您可以通过使用os.path.join来避免使用斜杠 - 这是构建路径的推荐方式)

好的答案,但在您最后一点上,使用os.path.join或os.path.sep比手动创建路径更好。 - James Brady
完美地符合我的需求。谢谢! - Sean
很高兴看到我自己在权限方面的挣扎并没有被遗忘 :-) - Abgan

5
虽然 os.access 尽力判断路径是否可访问,但它并不完美。来自 Python 文档的说明:
注意:即使 access() 指示操作将成功,I/O 操作可能会失败,特别是对于网络文件系统上的操作,这些操作可能具有超出常规 POSIX 权限位模型的权限语义。
推荐的方法是尝试执行操作并捕获任何异常,以确定用户是否有权限执行该操作。

0

实际上,'C:\haveaccess'与r'C:\haveaccess'是不同的。 从Python的角度来看,'C:\haveaccess'不是一个有效的路径,因此请改用'C:\\haveaccess'。 我认为os.access可以很好地工作。


“C:\haveaccess” 是一个有效的路径,因为 “\h” 没有特殊含义,所以它可以正常工作(纯属运气但确实可行)。 - Jean-François Fabre

0
我将提供@dF.使用os.scandir/os.listdirEAFP的方法的代码。
def can_access(path: str) -> bool:
    """Check if we can access folder on network drive"""
    try:
        os.scandir(path)
        return True
    except PermissionError:
        return False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接