我不理解的东西:
在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)。 谁能解释这个结果呢?
答案 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]))
获得正确的结果。