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 に答える