当前位置:  开发笔记 > 编程语言 > 正文

使用Python查找损坏的符号链接

如何解决《使用Python查找损坏的符号链接》经验,为你挑选了3个好方法。

如果我打电话os.stat()给一个破碎的symlink,python会抛出OSError异常.这使它有助于找到它们.但是,还有一些其他原因os.stat()可能引发类似的异常.symlinks在Linux下有没有更精确的方法来检测Python 损坏?



1> Thomas Vande..:

一个常见的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


如果链接'path'被赋予其目标的相对路径,则os.readlink(path)可能无法获得实际路径.例如,如果path链接到'../target',当您运行的脚本不在链接所在的路径中时,os.path.exists(os.readlink(path))将返回false,因为在路径中对于您的脚本,其上层目录没有名为"target"的文件或文件夹.避免这种情况的一种安全方法是使用os.path.exists(os.path.realpath(path)).

2> Greg Hewgill..:

os.lstat()可能会有所帮助.如果lstat()成功并且stat()失败,那么它可能是一个断开的链接.



3> am70..:

这不是原子的,但它有效.

os.path.islink(filename) and not os.path.exists(filename)

事实上, 我们看到RTFM(阅读精彩的手册)

os.path.exists(路径)

如果path指向现有路径,则返回True.对于损坏的符号链接,返回False.

它还说:

在某些平台上,如果未授予对所请求文件执行os.stat()的权限,则此函数可能返回False,即使路径实际存在也是如此.

因此,如果您担心权限,则应添加其他子句.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有