2016-06-16 8 views
29

複数のオープンソースプロジェクトでは、現在のファイルへの絶対パスを取得するために人々がos.path.abspath(os.path.realpath(__file__))を行っているのを見たことがあります。しかし、私はos.path.abspath(__file__)os.path.realpath(__file__)が同じ結果を生むことがわかります。 os.path.abspath(os.path.realpath(__file__))は少し冗長であるようです。人々がそれを使用している理由はありますか?os.path.abspathとos.path.realpathの両方を使用する理由

答えて

24

os.path.realpathは、それらをサポートするオペレーティングシステム上のシンボリックリンクを無効にします。

os.path.abspathは単に

$ ls -l 
total 0 
-rw-rw-r-- 1 guest guest 0 Jun 16 08:36 a 
lrwxrwxrwx 1 guest guest 1 Jun 16 08:36 b -> a 

$ python 
Python 2.7.11 (default, Dec 15 2015, 16:46:19) 
[GCC 4.8.4] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 

>>> from os.path import abspath, realpath 

>>> abspath('b') 
'/home/guest/play/paths/b' 

>>> realpath('b') 
'/home/guest/play/paths/a' 

Ubuntuの

に、指定したファイル(またはシンボリックリンク)例えば

にディレクトリツリーのルートからのフルパスを与えるパスから...のようなものを削除しますシンボリックリンクには相対パスが含まれるため、両方を使用する必要があります。 realpathへの内部コールは、..部分が埋め込まれたパスを返します。次に、abspathが削除されます。

+3

この答えは2つの機能の違いについて説明しているが、 ''含めることができます)( 'のrealpathの結果というのは本当ではない..ですあなたがなぜ両方を使うのかという疑問に本当に答えることはできません。 jobradの答えはより正確です。 – Miles

43

os.path.realpathは実際にos.path.abspathを呼び出して結果を返す前に(私はPython 3.6をPython 3.6にチェックしたので)、realpathとabspathを組み合わせる理由はありません。

  • 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 
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' 
0

:カレントディレクトリ(./)はこのようになります。これは、私のホームディレクトリですショートカットロケーションに存在するファイルの完全パス。realpathは、ファイルのパスを示します。

絶対パスos.path.abspath()は、現在の作業ディレクトリまたは指定したディレクトリにあるファイルの完全パスを返します。

実パスos.path.realpath()は、参照されているファイルの完全パスを返します。

例:

file = "shortcut_folder/filename" 
os.path.abspath(file) = "C:/Desktop/shortcut_folder/filename" 
os.path.realpath(file) = "D:/PyCharmProjects/Python1stClass/filename" 
関連する問題