73

当我给 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

如何用..符号链接或软链接文件的父目录的实际完整路径替换。

4

6 回答 6

136
os.path.realpath(path)

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

于 2010-07-10T20:46:40.073 回答
17

正如 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 中,我知道那里没有修复它。

于 2012-03-10T01:38:34.560 回答
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') 
  ) 
)
于 2010-07-10T20:39:02.270 回答
6

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

import pathlib

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

文档Path.resolve(strict=False):使路径成为绝对路径,解析任何符号链接。返回一个新的路径对象。

于 2019-02-21T17:59:39.813 回答
1

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

它返回目录的绝对路径。

这也适用于 Ubuntu 16.04、python 3.5。

于 2018-03-31T16:49:14.017 回答
0

文档说要使用os.path.join()

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

于 2017-11-09T23:26:26.253 回答