python - 使用 pathlib 获取符号链接(symbolic link)的目标

标签 python python-3.x symlink pathlib

有没有办法使用 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/

相关文章:

python - 如何从字符串中删除\n 和\r

linux - 具有相同 inode 的操作系统符号链接(symbolic link)

github - 如何在 github 上的 monorepo 中设置 README.md 的符号链接(symbolic link)

java - Python - 我如何读入和读出以便其他读者可以阅读它以进一步追求?

python - 使用 isinstance 测试 Unicode 字符串

python - 如何从元素列表开始进行回归

python - Spyder 不更新 .pyc 文件

python - Pandas 可以自动检测不同的日期时间格式

java - 哪些java.nio.file.Files方法遵循符号链接(symbolic link),哪些不遵循符号链接(symbolic link)?

python - 在 python 中使用 Newton-Cotes 方法进行集成