複数のオープンソースプロジェクトでは、現在のファイルへの絶対パスを取得するために人々が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の両方を使用する理由
答えて
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
が削除されます。
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'
:カレントディレクトリ(./
)はこのようになります。これは、私のホームディレクトリですショートカットロケーションに存在するファイルの完全パス。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"
- 1. XMLにXSDとDTDの両方を使用する理由
- 2. viewcontrollerの実装とヘッダファイルの両方で '@ interface ViewController'を使用する理由
- 3. "yield"を使用すると、コンパイラ生成型がIEnumerableとIEnumeratorの両方を実装する理由
- 4. JumboEnumSetを使用する理由とその理由
- 5. TreeMapを使用する理由と使用方法
- 6. SSRS vs. Power BI - 使用する理由とその理由
- 7. ng-showが両方の状況で動作するときにng-hideを使用する理由
- 8. os.getcwd()とos.path.abspath(os.path.dirname(__ file__))
- 9. 同じフィールドでプライマリキーとユニークキーの両方を使用する理由はありますか?
- 10. symfony 2が 'deps'ファイルと 'composer.json'ファイルの両方を使用する理由を教えてください。
- 11. ソートをソートする理由累積を使用する理由
- 12. Googleのウェブサイトの検索エンジンを使用する理由とその理由
- 13. 管理者と管理者の両方でSonataAdminBundleを転用する方法
- 14. 春のAndroidを使用する理由
- 15. os.path.abspath(「FILE1.TXT」)は
- 16. iOSの開発にSalesforceとZksforceを使用する方法とその理由
- 17. ElasticsearchとSphinxの両方を使用
- 18. 837Pマルチプルスキンとシングルスキーマの両方を使用
- 19. beginInvokeとDebuggerStepThroughAttributeと他の属性を使用する理由
- 20. Ruby on Railsのテストスイートにセットアップ方法を使用する理由
- 21. laravelでガードを使用する理由
- 22. React.cloneElementを使用する理由?
- 23. Dで@propertyを使用する理由
- 24. (void)someIntを使用する理由コード
- 25. aspを使用する理由:HyperLink
- 26. データソースにJNDIを使用する理由
- 27. Fluxでスイッチを使用する理由
- 28. Netty:TimeServerHandlerでChannelInboundHandlerAdapterを使用する理由
- 29. scala.collection.immutable.Stackを使用する理由
- 30. 送信キューを使用する理由
この答えは2つの機能の違いについて説明しているが、 ''含めることができます)( 'のrealpathの結果というのは本当ではない..ですあなたがなぜ両方を使うのかという疑問に本当に答えることはできません。 jobradの答えはより正確です。 – Miles