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

如何找到目标文件&x27;s python中符号链接或软链接的完整(绝对路径),python,linux,absolute-path,symlink,Python,Linux,Absolute Path,Symlink,当我给 ls-l/etc/font/conf.d/70-yes-bitmaps.conf lrwxrwxrwx <snip> /etc/fonts/conf.d/70-yes-bitmaps.conf -> ../conf.avail/70-yes-bitmaps.conf lrwxrwx/etc/font/conf.d/70-yes-bitmaps.conf->../conf.avail/70-yes-bitmaps.conf 对于符号链接或软链接,如何在python中找

当我给 ls-l/etc/font/conf.d/70-yes-bitmaps.conf

lrwxrwxrwx <snip> /etc/fonts/conf.d/70-yes-bitmaps.conf -> ../conf.avail/70-yes-bitmaps.conf
lrwxrwx/etc/font/conf.d/70-yes-bitmaps.conf->../conf.avail/70-yes-bitmaps.conf
对于符号链接或软链接,如何在python中找到目标文件的完整(绝对路径)

如果我使用

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

它输出

。/conf.avail/70是位图.conf

但我需要的是绝对路径而不是相对路径,所以我想要的输出必须是

/etc/font/conf.avail/70是位图.conf

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

另外还有
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') 
  ) 
)

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

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

我已经为Python 3.2创建了一个修补程序来修复此错误,并将其上载到:

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

我还将其放在我的服务器上,如下所示:

不幸的是,Python2.x中也存在该缺陷,我知道没有修复该缺陷的方法。

声明使用
os.path.join()

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


在Windows10上,Python3.5,
os.readlink(“C:\\Users\PP”)
其中“C:\Users\PP”是一个符号链接(不是连接链接)

它返回目录的绝对路径

这也适用于Ubuntu 16.04和python 3.5。

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

import pathlib

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

文档用于
路径。解析(strict=False)
:将路径设置为绝对路径,解析任何符号链接。返回一个新的path对象。

os.path.realpath不会消除Windows 7下Python 3.2中的符号链接。(虫子?)嗯。。。我发现这是一个已经存在了1.5年的开放性bug:是的,3年后也遇到了同样的问题:cin Python3,如果您使用的是
Path
对象,那么您可以通过执行
Path.resolve()
在Python 3.8中修复Windows问题:“在版本3.8中更改:符号链接和连接现在在Windows上得到解决。”但是要注意:如果您将一个非符号链接的路径传递给readlink,它会很生气,并给出以下异常:
OSError:[Errno 22]无效参数:“您的路径”
os。readlink
应该可以在ubuntu/windows、python 3.5上运行。刚刚测试过:
os.path.abspath
?不需要,@dmitry\u romanov。如果您只调用了
os.path.abspath(result)
,它将不知道路径应该从哪里开始。这就是为什么需要传入
path
。如果
result
已经是绝对路径,则
join
是智能的。文档中写道:“如果组件是绝对路径,那么之前的所有组件都将被丢弃,并从绝对路径组件继续连接。”
import pathlib

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