2

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

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

4

2 回答 2

2

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
于 2014-11-26T18:53:10.097 回答
0

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

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

于 2014-11-26T18:54:35.843 回答