使用pathlib获取符号链接的目标

时间:2017-01-04 09:34:10

标签: python python-3.x symlink pathlib

有没有办法使用pathlib获取符号链接的目标?我知道可以使用os.readlink()完成此操作。

我想创建一个由链接及其目标文件组成的字典。

links = [link for link in root.rglob('*') if link.is_symlink()]
files = [Path(os.readlink(str(pointed_file))) for pointed_file in links]

编辑 ...我希望过滤所有非绝对的路径

    link_table = {link : pointed_file for link, pointed_file in zip(links, files) if pointed_file.is_absolute()}

1 个答案:

答案 0 :(得分:6)

不,目前无法获得pathlib给出os.readlink()的结果。 Path.resolve()不适用于损坏的链接,并且会引发FileNotFoundError(Python <3.5)或返回可能奇怪的路径(Python 3.6)。仍然可以使用Path.resolve(True)获得旧行为,但这意味着版本之间不兼容(顺便提一下,包文档中没有提到Py3.6发布文档的Porting部分)。

关于绝对路径的更新问题,尽管已接受答案,但os.readlink()是检查符号链接是绝对路径还是相对路径的唯一方法。 Path.relative_to()如名称所示,将现有路径转换为相对路径,而不检查符号链接目标路径是否以“/”开头。这同样适用于Path.is_absolute()。最后Path.resolve()用于现有目标,转换目标路径,以便在途中销毁所需信息。

上面的奇异路径我的意思是,让我们在/home/test中说出指向.myapp的符号链接.config/myapp/config。如果.config/myapp不存在且代码是用Py&lt; = 3.5编写的,Path.resolve()会引发异常,应用程序可以通知用户丢失的文件。现在,如果在没有代码更改的情况下从Py3.6调用,它会解析为~/.config/myapp,不会抛出异常,因此请检查.resolve()次传递,但是稍后当应用程序尝试时可能会抛出另一个异常打开文件进行阅读,因此用户可能会收到~/config/myapp文件未找到的消息,尽管这不是真正缺少的文件。可能更糟糕的是 - 当应用程序执行Path('/home/test/.myapp').resolve().open('w')时(不一定是一步,但让我们说是某些清理过程的一部分),那么就会创建错误的文件。当然,下次调用应用程序时,路径会更深一层地解析为/home/test/.config/myapp/config(因为Path.resolve()不检查myapp是否是目录),以及读取和写入将因NotADirectoryError例外而失败(有一些误导性"Not a directory: /home/test/.config/myapp/config"作为描述......)。