回答:
モジュールが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
どのような違いますことを確認するなどして)。
name '__file__' is not defined
ます。
__file__
モジュールがファイルからロードされた場合、モジュールのロード元のファイルのパス名です。これは__file__
、インタープリターではなくスクリプトとして実行した場合にのみ機能することを意味します(インタープリターにインポートしない限り...)
最初にいくつかの混乱に対処したいと思います。 __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
__file__
:静的にリンクされたCモジュールなど、すべてのケースで定義されているわけではありません。__file__
いつでもご利用いただけるとは限りません。