如果我打电话os.stat()
给一个破碎的symlink
,python会抛出OSError
异常.这使它有助于找到它们.但是,还有一些其他原因os.stat()
可能引发类似的异常.symlinks
在Linux下有没有更精确的方法来检测Python 损坏?
一个常见的Python谚语是,请求宽恕比允许更容易.虽然我不喜欢现实生活中的这种说法,但它确实适用于很多情况.通常,您希望避免在同一文件上链接两个系统调用的代码,因为您永远不知道代码中两次调用之间文件会发生什么.
一个典型的错误是写下这样的东西:
if os.path.exists(path): os.unlink(path)
第二个调用(os.unlink)可能会失败,如果在if测试之后删除了其他内容,则引发异常,并停止执行其余的函数.(你可能会认为这在现实生活中不会发生,但我们上周刚从我们的代码库中捕获了另一个错误 - 这种错误让一些程序员摸不着头脑并声称'Heisenbug'最近几个月)
所以,在你的特殊情况下,我可能会这样做:
try: os.stat(path) except OSError, e: if e.errno == errno.ENOENT: print 'path %s does not exist or is a broken symlink' % path else: raise e
这里的烦恼是stat为符号链接返回相同的错误代码,该符号链接不在那里且符号链接损坏.
所以,我猜你别无选择,只能破坏原子性,并做类似的事情
if not os.path.exists(os.readlink(path)): print 'path %s is a broken symlink' % path
os.lstat()可能会有所帮助.如果lstat()成功并且stat()失败,那么它可能是一个断开的链接.
这不是原子的,但它有效.
os.path.islink(filename) and not os.path.exists(filename)
事实上, 我们看到RTFM(阅读精彩的手册)
os.path.exists(路径)
如果path指向现有路径,则返回True.对于损坏的符号链接,返回False.
它还说:
在某些平台上,如果未授予对所请求文件执行os.stat()的权限,则此函数可能返回False,即使路径实际存在也是如此.
因此,如果您担心权限,则应添加其他子句.