【问题标题】:how to find the target file's full(absolute path) of the symbolic link or soft link in python如何在python中找到符号链接或软链接的目标文件的完整(绝对路径)
【发布时间】:2011-03-14 08:10:58
【问题描述】:

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

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

【问题讨论】:

标签: python linux absolute-path symlink


【解决方案1】:

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

【讨论】:

  • 请注意:如果您将不是符号链接的路径传递给 readlink,它会生气并给出以下异常:OSError: [Errno 22] Invalid argument: 'your-path'
【解决方案2】:
os.path.realpath(path)

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

【讨论】:

  • os.path.realpath 不会消除 Windows 7 下 Python 3.2 中的符号链接。(一个错误?)
  • 嗯...我看到这是一个开放的错误 1.5 年:bugs.python.org/issue9949
  • 是的,3 年后遇到了同样的问题:c
  • 在 Python3 中,如果你使用 Path 对象,你可以通过 path.resolve() 来做同样的事情
  • Windows 问题已在 Python 3.8 中得到修复:“3.8 版已更改:符号链接和联结现已在 Windows 上得到解决。”
【解决方案3】:

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

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

http://bugs.python.org/issue9949

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

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

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

不幸的是,该错误也存在于 Python 2.x 中,我知道那里没有修复它。

【讨论】:

    【解决方案4】:

    documentation 表示使用os.path.join()

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

    【讨论】:

    • os.path.abspath ?
    • 不需要,@dmitry_romanov。如果你只是调用os.path.abspath(result),它不会知道路径应该从哪里开始。这就是为什么你需要传入path。如果result 已经是一个绝对路径,那么join 是聪明的。来自文档:“如果组件是绝对路径,则所有先前的组件都将被丢弃,并从绝对路径组件继续连接。”
    【解决方案5】:

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

    它返回目录的绝对路径。

    这也适用于 Ubuntu 16.04,python 3.5。

    【讨论】:

      【解决方案6】:

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

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

      文档:使路径成为绝对路径,解析任何符号链接。返回一个新的路径对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-10
        • 2017-09-28
        • 1970-01-01
        • 2011-03-13
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多