使用带有符号链接的listdir realpath abspath

时间:2014-11-26 18:51:47

标签: python realpath

我不理解的东西:
在shell中:

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)。 谁能解释这个结果呢?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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