【问题标题】:Issue with os.walk onerror argumentos.walk onerror 参数的问题
【发布时间】:2018-03-20 19:55:19
【问题描述】:

我到处搜索,但找不到关于 os.walk(onerror) 工作原理的解释。

os.walk 默认忽略 listdir() 错误,但我至少需要收到警报,最好是导致此错误的目录路径。我应该如何设置这个参数?

感谢您的帮助。

【问题讨论】:

  • 请。在发布您的问题之前搜索 SO。很可能它已经被回答了。查看骗子的答案。
  • @PatrickArtner 在我看来,这不是重复的。它询问为什么默认忽略错误,询问如何设置错误处理程序。
  • @wim 答案是。他们引用了有关如何设置错误处理程序的 api。?
  • @PatrickArtner 你看的不是我吗?他们没有显示任何关于如何设置处理程序的代码..
  • 你为什么不把你想要的消息发布为评论@PatrickArtner

标签: python exception os.walk


【解决方案1】:

错误处理程序应该是可调用的。它将使用一个参数调用,即异常实例。

def walk_error_handler(exception_instance):
    print("uh-oh!")  # you probably want to do something more substantial here..

for root, dirs, files in os.walk(dirname, onerror=walk_error_handler):
    ...

os.walk 默认忽略错误是设计使然。这允许 walk 继续遍历其他目录,例如,由于权限不足而无法列出 walk 中遇到的一个子目录。

在处理异常实例时,您感兴趣的所有信息都可能包含在exception_instance.argstype(exception_instance) 中。由于它是OSError(或子类型),errno 将是一个有用的属性。

您可以与 stdlib errno 模块的常量进行比较。例如,权限被拒绝是errno.EACCES (13)。如果您尝试将/root 列为普通用户,就会出现这种错误。

【讨论】:

  • 有什么方法可以得到错误的属性吗?我试图调用 strerror() 但它返回“TypeError: 'member_descriptor' object is not callable”
  • 还有一个问题。有没有办法找出它试图打开的文件?
  • 是:检查exception_instance.filename 属性。
  • 谢谢,对我帮助很大。我希望它能帮助更多处于类似情况的人。
猜你喜欢
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多