複数のオープンソース プロジェクトで、os.path.abspath(os.path.realpath(__file__))
現在のファイルへの絶対パスを取得するために人々が行っていることを私は見てきました。
しかし、同じ結果os.path.abspath(__file__)
が生成されることが分かりました。少し冗長であるように思われます。os.path.realpath(__file__)
os.path.abspath(os.path.realpath(__file__))
人々がそれを使用する理由はあるのでしょうか?
ベストアンサー1
あなたが述べたシナリオでは、realpathとabspathを組み合わせる理由はありません。os.path.realpath
os.path.abspath
結果を返す前に実際に呼び出されます(Python 2.5 から Python 3.6 まで確認しました)。
os.path.abspath
絶対パスを返しますが、引数内のシンボリックリンクは解決しません。os.path.realpath
まずパス内のシンボリック リンクを解決し、次に絶対パスを返します。
ただし、パスに が含まれることが予想される場合は~
、abspath も realpath も~
ユーザーのホームディレクトリに解決されず、結果のパスは無効になります。使用する必要がありますos.path.expanduser
これをユーザーのディレクトリに解決します。
徹底的な説明のために、Windows と Linux、Python 3.4 と Python 2.6 で検証した結果をいくつか示します。現在のディレクトリ ( ./
) は私のホーム ディレクトリで、次のようになります。
myhome
|- data (symlink to /mnt/data)
|- subdir (extra directory, for verbose explanation)
# os.path.abspath returns the absolute path, but does NOT resolve symlinks in its argument
os.path.abspath('./')
'/home/myhome'
os.path.abspath('./subdir/../data')
'/home/myhome/data'
# os.path.realpath will resolve symlinks AND return an absolute path from a relative path
os.path.realpath('./')
'/home/myhome'
os.path.realpath('./subdir/../')
'/home/myhome'
os.path.realpath('./subdir/../data')
'/mnt/data'
# NEITHER abspath or realpath will resolve or remove ~.
os.path.abspath('~/data')
'/home/myhome/~/data'
os.path.realpath('~/data')
'/home/myhome/~/data'
# And the returned path will be invalid
os.path.exists(os.path.abspath('~/data'))
False
os.path.exists(os.path.realpath('~/data'))
False
# Use realpath + expanduser to resolve ~
os.path.realpath(os.path.expanduser('~/subdir/../data'))
'/mnt/data'