如何在python中找到目标文件的符号链接或软链接的完整(绝对路径)

时间:2010-07-10 20:36:13

标签: python linux absolute-path symlink

当我给予 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 个答案:

答案 0 :(得分:101)

os.path.realpath(path)

os.path.realpath返回指定文件名的规范路径,消除路径中遇到的任何符号链接。

答案 1 :(得分:13)

正如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

不幸的是,这个bug也存在于Python 2.x中,我知道它没有修复它。

答案 2 :(得分:8)

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') 
  ) 
)

答案 3 :(得分:0)

documentation说使用os.path.join()

  

结果可以是绝对路径名或相对路径名;如果它是相对的,则可以使用os.path.join(os.path.dirname(path), result)将其转换为绝对路径名。

答案 4 :(得分:0)

在Windows 10上,python 3.5,os.readlink("C:\\Users\PP")其中“C:\ Users \ PP”是符号链接(不是联结链接)。

返回目录的绝对路径。

这适用于Ubuntu 16.04,python 3.5。

答案 5 :(得分:0)

我建议使用pathlib库进行文件系统操作。

import pathlib

x = pathlib.Path('lol/lol/path')
x.resolve()
Path.resolve(strict=False)

文档:将路径设为绝对路径,解决所有符号链接。返回一个新的路径对象。