【问题标题】:PermissionError: [WinError 5] instead of IsADirectoryErrorPermissionError: [WinError 5] 而不是 IsADirectoryError
【发布时间】:2019-12-18 20:36:16
【问题描述】:

根据 os 模块的官方文档,IsADirectoryError 是在目录上使用 os.remove() 时引发的异常。

我希望下面的代码可以创建和删除一个目录,但它会出错:

>>> os.mkdir(r'C:\test')
>>> try:
...     os.remove(r'C:\test')
... except IsADirectoryError:
...     os.rmdir(r'C:\test')
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
PermissionError: [WinError 5] Access is denied: 'C:\\test'

为什么我收到权限错误而不是预期的 IsADirectoryError?

编辑:只需运行 os.rmdir(r'C:\test') 即可,因此我的脚本确实有权删除该文件夹。

编辑:有人建议我捕获 WinError 5 并尝试将其作为文件夹处理,如果这不起作用,则继续处理 WinError 5 的其他错误可能性。如下所示,这可以快速创建丑陋的代码。有没有办法区分引发 WinError 5 异常的不同错误?如果没有,是否有更简洁的方法来处理所有可能的情况?

try:
    os.remove(r'C:\test')
except WindowsError as e:
    if e.winerror==5: #maybe it's a directory
        try: 
            os.rmdir(r'C:\test')
        except WindowsError as f:
            if f.winerror==5: #maybe it's read-only
                try:
                    os.chmod(r'C:\test', 0o777)
                except WindowsError as g:
                    if f.winerror==5: #maybe we don't have access
                    ...

【问题讨论】:

  • 因为您的脚本无权获取C:\test 路径的统计信息
  • @AzatIbrakov 如果它创建了文件夹,为什么它没有访问权限?如何授予它访问权限?
  • 我猜是因为它直接在C:\ 下。尝试另一条路径。就像您的用户文件夹一样。 PermissionError 在被检查为目录之前就被提出了
  • @Tomerikoo 我在为 C:\Users\myusername\test 执行此操作时得到相同的结果

标签: python error-handling operating-system


【解决方案1】:

文档 (https://docs.python.org/3.8/library/exceptions.html) 说 IsADirectoryError 对应于 errno=EISDIR,因此如果操作系统返回 EISDIR,则会引发此问题。 Windows,当使用 os.remove 删除目录时会引发 WindowsError ,因为 Python 不会从操作系统获取 EISDIR 作为响应,而是其他东西。这可以简单地处理:

try:
    os.remove(r'C:\test')
except WindowsError as e:
    if e.winerror == 5: # maybe we tried to remove a directory, so
        os.rmdir(r'C:\test')
    else:
        raise # we just re-raise whatever the exception was.

【讨论】:

  • 如果我真的被拒绝访问怎么办?如何区分这两个错误?
  • 尝试在一个你实际上没有权限的目录上运行它,看看你得到了什么异常。 ;)
  • 我得到 WinError 5 和在处理关于异常的过程中:WinError 5。那么,除了 WinError 5 可能意味着的所有模式的模式之外,我应该链接 try 吗?
猜你喜欢
  • 2021-03-17
  • 2020-05-03
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多