如何在Python中获取符号链接目标?

zor*_*ggy 20 python symlink

使用Python,我需要检查数百个符号链接是否正确,否则重新创建它们.我现在所做的是比较我想要的和我拥有的真实路径,但它很慢,因为它是通过NFS自动挂载的.

否则,我将使用命令'ls -l'运行子进程并处理返回的字符串列表.我更喜欢使用Python库的更好的解决方案......

编辑1:我有:link_name -> link_target然后link_target -> a_real_file.我需要的是提取link_target自link_name,没有a_real_file.我不在乎真实文件是否存在.

编辑2:也许我没有正确表达.正确符号链接的意思是' 指向预定义路径的链接,即使它不存在 '.所以我需要检查一下:

link_name_1 -> target_1
link_name_2 -> target_2
Run Code Online (Sandbox Code Playgroud)

这就是为什么我需要提取目标,而不是真正的路径.然后我将它们与参考(字典)进行比较.所以我的问题是:如何提取目标路径?

wim*_*wim 25

问题os.readlink()是它只会解决链接的1个步骤.我们可以在那里的情况下A链接到另一个链接B,并B链接晃来晃去.

$ ln -s /tmp/example/notexist /tmp/example/B
$ ln -s /tmp/example/B /tmp/example/A
$ ls -l /tmp/example
A -> /tmp/example/B
B -> /tmp/example/notexist
Run Code Online (Sandbox Code Playgroud)

现在在Python中,os.readlink为您提供第一个目标.

>>> import os
>>> os.readlink('A')
'/tmp/example/B'
Run Code Online (Sandbox Code Playgroud)

但在大多数情况下,我认为我们对已解决的路径感兴趣.所以pathlib可以在这里帮忙:

>>> from pathlib import Path
>>> Path('A').resolve()
PosixPath('/tmp/example/notexist')
Run Code Online (Sandbox Code Playgroud)

对于较旧的Python版本:

>>> os.path.realpath('A')
'/tmp/example/notexist'
Run Code Online (Sandbox Code Playgroud)


Arm*_*igo 12

你需要看看os.readlink().

  • 请考虑编辑您的帖子,以添加有关您的代码的功能以及解决问题的原因的更多说明.一个主要只包含代码的答案(即使它正在工作)通常不会帮助OP理解他们的问题. (2认同)

Sup*_*ova 7

在 Python 3.9 或更高版本中,pathlib.Path.readlink()可以使用。

>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.readlink()
PosixPath('setup.py')
Run Code Online (Sandbox Code Playgroud)

  • 我认为每个人都应该停止使用“os.path”并尽可能转向“pathlib”。用新功能更新旧问题,做得很好。+1 希望这会向上:) (4认同)

小智 -3

要确定目录条目是否是符号链接,请使用以下命令:

os.path.islink(路径)

如果路径引用的是符号链接的目录条目,则返回 True。如果不支持符号链接,则始终为 False。