Ich möchte nur zuerst auf einige Verwirrung eingehen. __file__
ist kein Platzhalter, sondern ein Attribut. Doppelte Unterstrichattribute und -methoden gelten gemäß Konvention als "speziell" und dienen einem besonderen Zweck.
http://docs.python.org/reference/datamodel.html zeigt viele der speziellen Methoden und Attribute, wenn nicht alle.
In diesem Fall __file__
handelt es sich um ein Attribut eines Moduls (ein Modulobjekt). In Python ist eine .py
Datei ein Modul. Also import amodule
wird ein Attribut haben, __file__
das unter verschiedenen Umständen verschiedene Dinge bedeutet.
Entnommen aus den Dokumenten:
__file__
ist der Pfadname der Datei, aus der das Modul geladen wurde, wenn es aus einer Datei geladen wurde. Das __file__
Attribut ist für C-Module, die statisch mit dem Interpreter verknüpft sind, nicht vorhanden. Bei Erweiterungsmodulen, die dynamisch aus einer gemeinsam genutzten Bibliothek geladen werden, ist dies der Pfadname der gemeinsam genutzten Bibliotheksdatei.
In Ihrem Fall greift das Modul auf sein eigenes __file__
Attribut im globalen Namespace zu.
Um dies in Aktion zu sehen, versuchen Sie:
# file: test.py
print globals()
print __file__
Und Renn:
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py
__file__
ist NICHT in allen Fällen definiert, z. B. statisch verknüpfte C-Module. Wir können uns nicht darauf verlassen,__file__
immer verfügbar zu sein.