有没有办法使用 pathlib
获取符号链接(symbolic link)的目标?我知道这可以使用 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()}
最佳答案
更新:Python 3.9 引入了 Path.readlink()
方法,因此以下说明仅适用于早期版本。
不,目前不可能从 os.readlink()
给出的 pathlib
得到结果。 Path.resolve()
不适用于损坏的链接,并且会引发 FileNotFoundError
(Python <3.5) 或返回可能奇怪的路径 (Python 3.6)。仍然可以使用 Path.resolve(True)
获得旧行为,尽管这意味着版本之间不兼容(顺便说一下,在包文档和 Py3.6 发布文档的移植部分中均未提及)。
另外关于绝对路径的更新问题,os.readlink()
是检查符号链接(symbolic link)是绝对路径还是相对路径的唯一方法。 Path.relative_to()
顾名思义,将现有路径转换为相对路径,而不检查符号链接(symbolic link)目标路径是否以“/”开头。这同样适用于 Path.is_absolute()
。最后,针对现有目标的 Path.resolve()
转换目标路径,以便在途中销毁所需信息。
上面的奇怪的路径我的意思是,假设在/home/test
中有符号链接(symbolic link).myapp
指向.config/我的应用程序/配置
。如果 .config/myapp
不存在并且代码是用 Py<=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()
不会t 检查 myapp
是否是目录),读取和写入都将失败并出现 NotADirectoryError
异常(带有一点误导性 “不是目录:/home/test/.config/myapp/config"
作为描述……)。
关于python - 使用 pathlib 获取符号链接(symbolic link)的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41460434/