3

Python でパスを処理する方法に少し困惑しています。一般的な構成行「~」または「.」を使用する または「..」、特にパスを引数としてシェルコマンドに渡す場合、パスが有効または存在すると認識されない場合がよくあります。しかし、私が常に次のようなことをすると、すべての問題が解決します。

some_path = os.path.abspath(os.path.expanduser(some_path))

これは一般的な (または必要な) イディオムですか、それとも車輪の再発明をしているだけですか? 私がどこにいてsome_pathも、何かを行う関数に渡す前に上記のコードを持っている必要があると本当に期待する必要がありますか?

4

3 に答える 3

2

はい、呼び出すことができるほとんどのものは、そのイディオムを通過したパスを想定しています。シェルでそのようなパスを使用する場合 (たとえば、 のようなことを行う場合cat ~raxacoricofallapatorius/foo.txt)、パスの正規化を行うのは、実行する他のプログラムではなく、シェル自体です。cat

これは簡単に確認できます-たとえば、

lvc@tiamat:~/Projects$ echo ~
/home/lvc

したがって、これらの種類の変数を入力としてパスを取得することが予想される場合は、自分で前処理を行う必要があることを意味します。別の方法は、シェルを介してコマンドを実行し、発生するすべての問題に対処する準備を整えることです。

ただし、少なくとも UNIX ライクなシステム (Windows は同じように動作する場合とそうでない場合があります) では、これを実行する必要はありません。これらはシステム コールによって理解され、シェルはそれらを変換しません。例えば:...

lvc@tiamat:~/Projects$ file ..
..: directory
lvc@tiamat:~/Projects$ file ~
/home/lvc: directory

fileは変更されて..いませんが、 の展開された形式が表示されていることに注意してください~

これは、外部プログラムで直接機能するパスだけが必要なexpanduser場合expandvarsは、それをパススルーするだけで十分であることを意味します。abspath呼び出すプログラムが自分の作業ディレクトリとは異なる作業ディレクトリで実行される場合は、主に呼び出す必要があります。

于 2013-01-05T03:53:10.443 に答える
1

はい、解決済みの絶対パスが必要な場合は、それを$HOME行う必要があります。

この機能が定期的に必要な場合は、短いヘルパー関数を簡単に作成できます。次のようなパス ヘルパー ライブラリも利用できます。

于 2013-01-05T03:42:20.303 に答える
-1

一般的には良い考えです。os.path.abspath は、.、..、~ などの相対パスを解決します。コードを OS 間で移植可能にしたい場合は、可能であれば、独自のパス処理を定義する代わりに os.path を使用する必要があります。os.path は常に、使用している OS の正しいパス モジュールを指します。独自のパス関数を定義しようとすると、os.path の組み込みのクロスプラットフォーム動作が失われます。

于 2013-01-05T03:48:35.953 に答える