python - 使用 Python 查找损坏的符号链接(symbolic link)

标签 python linux symlink

如果我在损坏的 symlink 上调用 os.stat(),python 会抛出 OSError 异常。这对于找到它们很有用。但是,os.stat() 可能会抛出类似的异常还有其他一些原因。有没有更精确的方法在 Linux 下使用 Python 检测损坏的 symlinks

最佳答案

一个常见的 Python 说法是,请求宽恕比请求许可更容易。虽然我在现实生活中不喜欢这种说法,但它确实适用于很多情况。通常,您希望避免将两个系统调用链接在同一个文件上的代码,因为您永远不知道在代码中的两个调用之间文件会发生什么。

一个典型的错误是这样写:

if os.path.exists(path):
    os.unlink(path)

如果在你的 if 测试之后有其他东西删除了第二个调用 (os.unlink),它可能会失败,引发一个异常,并停止你的函数的其余部分执行。 (您可能认为这在现实生活中不会发生,但上周我们刚刚从我们的代码库中发现了另一个类似的错误 - 正是这种错误让一些程序员摸不着头脑并声称为“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 为不存在的符号链接(symbolic link)和损坏的符号链接(symbolic link)返回相同的错误代码。

所以,我想你别无选择,只能打破原子性,做类似的事情

if not os.path.exists(os.readlink(path)):
    print 'path %s is a broken symlink' % path

关于python - 使用 Python 查找损坏的符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20794/

相关文章:

Python AST 节点无法在函数内执行

python - 传递给 `np.ones` 的参数是什么?它在这里如何工作?

Linux 内核构建编译错误 stringop-overflow 和 sizeof-pointer-memaccess

linux - Linux下的MASM?

Bash 脚本自动创建符号链接(symbolic link)到树中的子目录

python - 保持运行/重新启动 python 脚本 (TwitterAPI)

python - 如何分割大型 XBRL 文件?

linux - 如何使用正则表达式重命名 linux shell 中的文件?

iphone - 使用 Objective-C 在 ios 文件系统上创建链接

asp.net - 为 IIS7 Web 环境创建符号链接(symbolic link)