__file__変数はどういう意味ですか?


177
A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

私は通常、これらを実際のパスに配線します。しかし、実行時にパスを決定するこれらのステートメントには理由があり、私はos.pathモ​​ジュールを実際に理解して、それを使い始めることができるようにしたいと思います。

回答:


162

モジュールがPythonのファイルから読み込まれると、__file__そのパスに設定されます。次に、それを他の関数で使用して、ファイルが配置されているディレクトリを見つけることができます。

例を1つずつ取り上げます。

A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.

B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.

C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.

これらから返されるさまざまな値をここで確認できます。

import os
print(__file__)
print(os.path.join(os.path.dirname(__file__), '..'))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.abspath(os.path.dirname(__file__)))

あなたは(のような異なる場所からそれを実行することを確認し./text.py~/python/text.pyどのような違いますことを確認するなどして)。


7
良い答えですが、他の答えから他の重要な詳細を参照してください__file__:静的にリンクされたCモジュールなど、すべてのケースで定義されているわけではありません。__file__いつでもご利用いただけるとは限りません。
Chris Johnson

5
インタプリタでは、すべての例がを返しname '__file__' is not definedます。
user1063287 14年

10
@ user1063287 DemoUserの答えを見てください。__file__モジュールがファイルからロードされた場合、モジュールのロード元のファイルのパス名です。これは__file__、インタープリターではなくスクリプトとして実行した場合にのみ機能することを意味します(インタープリターにインポートしない限り...)
YOUNG

59

最初にいくつかの混乱に対処したいと思います。 __file__ワイルドカードではなく、属性です。二重下線の属性とメソッドは、慣例により「特別」であると見なされ、特別な目的を果たします。

http://docs.python.org/reference/datamodel.htmlは、特別なメソッドと属性のすべてではないにせよ、それらの多くを示しています。

この場合__file__は、モジュール(モジュールオブジェクト)の属性です。Pythonでは、.pyファイルはモジュールです。そうimport amodule__file__、異なる状況下で異なることを意味する属性を持ちます。

ドキュメントから取得:

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

あなたの場合、モジュールはそれ自身にアクセスしています __file__グローバル名前空間属性にます。

この動作を確認するには、次のことを試してください。

# file: test.py

print globals()
print __file__

そして実行します:

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

23

ドキュメントごと:

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

そしてまた

__file__sys.builtin_module_names属性が設定されていないモジュールが組み込まれている(したがってにリストされている)場合を除き、ファイルへの「パス」になります。


13

__file__さまざまなos.pathモジュールと組み合わせて使用すると、すべてのパスが現在のモジュールのディレクトリの場所に対して相対的になります。これにより、モジュール/プロジェクトを他のマシンに移植できます。

プロジェクトでは、次のことを行います。

A = '/Users/myname/Projects/mydevproject/somefile.txt'

そして/home/web/mydevproject/、コードがパスを正しく見つけることができないように、deploymentsディレクトリを使用してサーバーにデプロイしようとします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.