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

duh*_*onn 59 python linux symlink absolute-path

当我给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
Run Code Online (Sandbox Code Playgroud)

所以对于符号链接或软链接,如何在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

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

unu*_*tbu 106

os.path.realpath(path)
Run Code Online (Sandbox Code Playgroud)

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

  • os.path.realpath不会消除Windows 7下的Python 3.2中的符号链接.(一个错误?) (4认同)
  • 在Python3中,如果您使用“Path”对象,则可以通过执行“path.resolve()”来完成相同的操作 (3认同)
  • 嗯...我发现这已经是一个开放的错误 1.5 年了:http://bugs.python.org/issue9949 (2认同)
  • 是的,3年后也遇到同样的问题:c (2认同)
  • Windows 问题在 Python 3.8 中得到修复:“版本 3.8 中已更改:符号链接和连接现在已在 Windows 上解决。” (2认同)

Dav*_*ton 14

正如unutbu所说,os.path.realpath(path)应该是正确的答案,返回指定文件名的规范路径,解析指向其目标的任何符号链接.但它在Windows下被破坏了.

我已经为Python 3.2创建了一个补丁来修复这个bug,并将其上传到:

http://bugs.python.org/issue9949

它修复了realpath()函数Python32\Lib\ntpath.py

我也把它放在我的服务器上,这里:

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

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


eru*_*orm 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') 
  ) 
)
Run Code Online (Sandbox Code Playgroud)

  • 但要注意:如果你传递一个不是符号链接的路径,它会生气并给出以下异常:`OSError:[Errno 22]无效的参数:'your-path'` (2认同)

Ale*_*lex 6

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

import pathlib

x = pathlib.Path('lol/lol/path')
x.resolve()
Run Code Online (Sandbox Code Playgroud)

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