【问题标题】:Using listdir realpath abspath with symbolic links将 listdir realpath abspath 与符号链接一起使用
【发布时间】:2014-11-26 18:51:47
【问题描述】:

我不明白的东西:
在外壳中:

mkdir -p /tmp/toto/titi/tutu    
touch /tmp/toto/tata    
ln -s /tmp/toto/tata /tmp/toto/titi/tutu/     
python    

然后在python中:

import os
zeList = os.listdir("/tmp/toto/titi/tutu/")
print os.path.realpath(zeList[0])
 >'/tata' 
print os.path.abspath(zeList[0])
 >'/tata' 

预期的结果应该是:/tmp/toto/tata(或/tmp/toto/titi/tutu/tata)。 谁能解释这个结果?

【问题讨论】:

    标签: python realpath


    【解决方案1】:

    os.listdir() 返回基本文件名,而不是完整路径:

    >>> import os
    >>> os.listdir("/tmp/toto/titi/tutu/")
    ['tata']
    

    如果没有路径,则认为文件相对于当前工作目录

    >>> os.getcwd()
    '/Users/mj/Development/venvs/stackoverflow-2.7'
    >>> os.path.realpath('tata')
    '/Users/mj/Development/venvs/stackoverflow-2.7/tata'
    

    先用路径加入文件名:

    testdir = "/tmp/toto/titi/tutu/"
    zeList = [os.path.join(testdir, fname) for fname in os.listdir(testdir)]
    

    现在符号链接已正确替换:

    >>> testdir = "/tmp/toto/titi/tutu/"
    >>> zeList = [os.path.join(testdir, fname) for fname in os.listdir(testdir)]
    >>> print os.path.realpath(zeList[0])
    /private/tmp/toto/tata
    >>> print os.path.abspath(zeList[0])
    /tmp/toto/titi/tutu/tata
    

    【讨论】:

      【解决方案2】:

      listdir 返回文件名,而不是路径。因此,您将一个相对路径传递给realpath,该路径相对于您的工作目录/ 进行解释。

      使用os.path.realpath(os.path.join(..., zeList[0])) 以获得正确的结果。

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 1970-01-01
        • 2010-09-16
        • 2014-12-23
        • 2011-05-29
        • 2016-08-09
        • 2021-12-24
        相关资源
        最近更新 更多