如何在Python中找到符号链接或软链接的目标文件的完整路径

85 投票
6 回答
84295 浏览
提问于 2025-04-16 01:06

当我输入

ls -l /etc/fonts/conf.d/70-yes-bitmaps.conf

时,

lrwxrwxrwx <snip> /etc/fonts/conf.d/70-yes-bitmaps.conf -> ../conf.avail/70-yes-bitmaps.conf

我想知道,如何在Python中找到一个符号链接(软链接)指向的文件的完整路径。

如果我使用

os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf')

它会输出

../conf.avail/70-yes-bitmaps.conf

但我需要的是完整路径,而不是相对路径,所以我想要的输出应该是:

/etc/fonts/conf.avail/70-yes-bitmaps.conf

我该如何把..替换成符号链接或软链接文件所在父目录的实际完整路径呢?

6 个回答

12

你可以查看这个链接了解更多信息:http://docs.python.org/library/os.path.html#os.path.abspath

还有 joinpath()normpath() 这两个函数,具体用哪个取决于你是在当前的工作目录下,还是在其他地方处理文件。如果你想要更直接的方式,normpath() 可能更适合你。

具体来说:

os.path.normpath( 
  os.path.join( 
    os.path.dirname( '/etc/fonts/conf.d/70-yes-bitmaps.conf' ), 
    os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf') 
  ) 
)
18

正如unutbu所说,os.path.realpath(path)应该是正确的解决方案,它可以返回指定文件名的标准路径,并把任何符号链接解析到它们的目标。但是在Windows系统下,这个功能是有问题的。

我为Python 3.2创建了一个补丁来修复这个错误,并把它上传到了:

http://bugs.python.org/issue9949

这个补丁修复了realpath()函数,具体在Python32\Lib\ntpath.py文件中。

我还把它放在我的服务器上,链接在这里:

http://www.burtonsys.com/ntpath_fix_issue9949.zip

不幸的是,这个错误在Python 2.x版本中也存在,我不知道那里有没有解决办法。

150
os.path.realpath(path)

os.path.realpath 这个函数会返回你指定的文件名的真实路径,也就是说,它会把路径中遇到的任何符号链接都去掉,给你一个标准的路径。

撰写回答