1. ホーム
  2. python

[解決済み] モジュール __file__ 属性は絶対的か相対的か?

2022-09-08 22:38:34

質問

理解するのに苦労しています __file__ . 私が理解したところでは __file__ はモジュールがロードされた絶対パスを返します。

私はこれを生成するのに苦労しています。私は abc.py で、1つのステートメント print __file__ から実行されます。 /d/projects/ python abc.py を返す abc.py からの実行 /d/ を返す projects/abc.py . 何か理由があるのでしょうか?

どのように解決するのですか?

からの ドキュメント :

__file__ は、モジュールがファイルからロードされた場合、そのファイルのパス名です。その __file__ 属性はインタープリタに静的にリンクされた C モジュールには存在しません。共有ライブラリから動的にロードされた拡張モジュールの場合、共有ライブラリファイルのパス名となります。

から メーリングリストスレッド に対するコメントで @kindall がリンクしたものです。

この特定の例を再現しようとしたわけではありませんが、その理由は インポートするたびに getpwd() を呼び出す必要はありません。 カレントディレクトリをキャッシュするためのプロセス内変数を持ちたくないからです。 ディレクトリをキャッシュするためのプロセス内変数を持ちたくないからです。(getpwd()は比較的遅く、時には完全に失敗することがあります。 は比較的遅く、時には失敗することがあり、それをキャッシュしようとすると、間違っている一定のリスクがあります)。

私たちが代わりに行うのは、site.pyのコードで、sys.pathの要素を走査し、それらを絶対パスに変換します。 sys.pathの要素を走査し、それらを絶対パスに変換するコードです。しかし、このコードは がsys.pathの前に挿入される前に実行されます。 の値は''です。

この続きは、次のように考えてください。 sys.path を含めない '' .

の部分から外れるわけです。 sys.path の部分の外側にいる場合は 絶対パス . の部分の中にいる場合は sys.path の中にいる場合、モジュールが含まれる部分には 相対パス .

もし、カレントディレクトリにあるモジュールをロードし、カレントディレクトリが sys.path にない場合は、絶対パスを取得します。

もし、カレントディレクトリにあるモジュールをロードし、カレントディレクトリが sys.path であれば、相対パスで表示されます。